前言
大家注意审题:Redis是多线程还是单线程?这个问题你要从多个方面回答,如果你仅仅只回答 “单线程” 肯定是说不过去的,为什么呢?以下是对该问题的梳理,希望对大家有帮助。
1. Redis单线程到底指什么?
没错,大家所熟知的Redis确实是单线程模型,指的是执行Redis命令的核心模块是单线程的,而不是整个 Redis实例就一个线程,Redis其他模块还有各自模块的线程的。
下面这个解释比较好:
Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器。它的组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器、事件处理器。因为文件事件分派器队列的消费是单线程的,所以Redis才叫单线程模型。
2. Redis不仅仅是单线程
一般来说Redis的瓶颈并不在CPU,而在内存和网络。如果要使用CPU多核,可以搭建多个Redis实例来解决。其实,Redis 4.0开始就有多线程的概念了,比如Redis通过多线程方式在后台删除对象、以及通过Redis模块实现的阻塞命令等。
来源官方的解释:
如果你能说到这里,对Redis单/多线程的理解也有你自己更多的认识了。另外,近期Redis 6正式发布了,其中有一个是被讨论了很久的多线程IO:
这个Theaded IO指的是在网络IO处理方面上了多线程,如网络数据的读写和协议解析等,需要注意的是,执行命令的核心模块还是单线程的。
所以,你要是再把Redis 6.0网络处理多线程这块回答上了,你也不至于 “请回” 了。之前有的人在后台和我杠精说:Redis 6不是还没发布吗?
Redis 6 Beta版本多线程这个说了多久了,作为一个程序员,如果这个还不能get到的话,那就有点OUT了,如果确实没听说还好,如果听说了,还要和我杠精,我就无言以对了,对于新技术的发展和学习不就是我们和面试官的谈资吗?
3. 为什么网络处理要引入多线程?
之前的段落说了,Redis的瓶颈并不在CPU,而在内存和网络。
内存不够的话,可以加内存或者做数据结构优化和其他优化等,但网络的性能优化才是大头,网络IO的读写在Redis整个执行期间占用了大部分的CPU时间,如果把网络处理这部分做成多线程处理方式,那对整个Redis的性能会有很大的提升。
网上也有对Redis单/多线程情况下的get/set操作性能做了对比:
从上面的性能测试图来看,多线程的性能几乎是单线程的两倍了,从该文章来看,这个只是简单的针对多线程性能的验证,并没有做很多严谨的测试,不能作为线上指标参考。
但可以知道的是,Redis在网络处理方面上了多线程确实会让Redis性能上一个新台阶,不过Redis 6.0刚发布,不可能有企业马上上生产环境,可能还需要一段时间的优化和验证,我们再期待吧。
最后,目前最新的6.0版本中,IO多线程处理模式默认是不开启的,需要去配置文件中开启并配置线程数,有兴趣的研究下吧。