先来处理题目第一个问题,这个问题问得非常不严谨,针对不同的问法有两种答法。先告诉你答案。
1. redis的核心业务,也就是命令处理部分是多线程还是单线程? 答案: 单线程。
2. 整个redis的运行是多线程还是单线程? 答案: 多线程。
redis整体
Redis 在 2.6 版本,会启动 2 个后台线程,分别处理关闭文件、AOF 刷盘这两个任务;
redis在4.0版本更新的时候就加入了异步删除的命令unlink,由于某些大key,删除时要处理的数据过多,会阻塞主线程的处理,就新增一个线程异步执行删除。
redis在6.0版本更新时在网络模型加入了多线程,提高了cpu的利用。这里不懂的可以去看看redis的io多路复用。
redis核心
从接收客户端请求->解析请求 ->进行数据读写等操作->发送数据给客户端这个是核心的业务,为单线程,不用担心数据方面线程安全的问题。
命令的处理是单线程为什么还这么快?
1. 抛开持久化不谈,Redis是纯内存操作,执行速度非常快,它的性能瓶颈是网络延迟而不是执行速度,因此多线程并不会带来巨大的性能提升。而且redis6.0版本之后添加多线程也只是去处理网络io,命令的一套处理还是单线程完成。
2. 多线程会导致过多的上下文切换,带来不必要的开销。
3. 引入多线程会增加线程安全问题,处理线程安全问题非常复杂,性能会大打折扣。