Redis 之 单线程 or 多线程
Redis是多线程还是单线程?
这个问题你要从多个方面回答,如果你仅仅只回答 “单线程” 肯定是说不过去的。原因往下看。
1、Redis 单线程到底指什么?
没错,大家所熟知的 Redis 确实是单线程模型,指的是 执行 Redis 命令的核心模块是单线程的
,而不是整个 Redis 实例就一个线程,Redis 其他模块还有各自模块的线程的。
2、Redis 不仅仅是单线程
一般来说Redis 的瓶颈并不在 CPU
,而在内存和网络。如果要使用 CPU 多核,可以搭建多个 Redis 实例来解决。
其实,Redis 4.0 开始就有多线程的概念
了,比如 Redis 通过多线程方式在后台删除对象、以及通过 Redis 模块实现的阻塞命令等。
Redis 6 正式发布
了,其中有一个是被说了很久的多线程IO
这个 Theaded IO
指的是在网络 IO 处理方面用上了多线程
,如网络数据的读写和协议解析等,需要注意的是,执行命令的核心模块还是单线程的
。
3、为什么网络处理要引入多线程?
之前的段落说了,Redis 的瓶颈并不在 CPU,而在内存和网络。
内存不够的话,可以加内存或者做数据结构优化和其他优化等,但网络的性能优化才是大头,网络 IO 的读写在 Redis 整个执行期间占用了大部分的 CPU 时间,如果把网络处理这部分做成多线程处理方式,那对整个 Redis 的性能会有很大的提升。
网上也有对 Redis 单/多线程情况下的 get/set 操作性能做了对比:
从上面的性能测试图来看,多线程的性能几乎是单线程的两倍了,从该文章来看,这个只是简单的针对多线程性能的验证,并没有做很多严谨的测试,不能作为线上指标参考。
但可以知道的是,Redis 在网络处理方面上了多线程确实会让 Redis 性能上一个新台阶,不过 Redis 6.0 刚发布,不可能有企业马上上生产环境
,可能还需要一段时间的优化和验证,我们再期待吧。
最后,目前最新的 6.0 版本中,IO 多线程处理模式默认是不开启的,需要去配置文件中开启并配置线程数
,有兴趣的研究下吧。