Redis 到底是单线程还是多线程?

相对于多线程而言,可以说 Redis 是单线程,但是这种说法也是不太准确的。为什么呢?下面来分析一下:

一、Redis 单线程到底指什么?

没错,大家所熟知的 Redis 确实是单线程模型,指的是执行 Redis 命令的核心模块是单线程的,而不是整个 Redis 实例就是一个线程,Redis 其他模块还是有各自模块的线程的。

下面这个解释比较好:

下面这个解释比较好:

Redis 基于 Reactor 模型开发了网络事件处理器,这个处理器被称为文件事件处理器。它的组成结构为4部分:多个套接字、IO 多路复用程序、文件事件分派器、事件处理器。

因为文件事件分派器队列的消费是单线程的,所以 Redis 才叫单线程模型。

二、Redis 不仅仅是单线程

一般来说,Redis 的瓶颈并不在 CPU,而在内存和网络。如果要使用 CPU 多核,可以搭建多个 Redis 来解决。

其实,Redis 4.0 开始就有多线程的概念了,比如 Redis 通过多线程方式在后台删除对象,以及通过 Redis 模块实现的阻塞命令等。

来源官方的解释:

来源官方的解释:

另外,前段时间 Redis 6 正式发布了,其中有一个是被说了很久的多线程 IO :

多线程 IO :

这个 Threaded I / O 指的是在网络 IO 处理方面上了多线程,如网络数据的读写和协议解析等,需要注意的是,执行命令的核心模块还是单线程的。

三、为什么网络处理要引入多线程?

上面的段落说了,Redis 的瓶颈并不在 CPU,而在内存和网络。

内存不够的话,可以加内存或者做数据结构优化和其他优化等,但网络的性能优化才是大头,网络 IO 的读写在 Redis 整个执行期间,占用了大部分的 CPU 时间,如果把网络处理这部分做成多线程处理方式,那对整个 Redis 的性能会有很大的提升。

网上也有对 Redis 单 / 多 线程情况下的 get / set 操作性能做了对比:

性能做了对比:

从上面的性能测试图来看,多线程的性能几乎是单线程的两倍了,从该文章来看,这个只是简单的针对多线程性能的验证,并没有做很多严谨的测试,不能作为线上指标参考。

但是可以知道的是,Redis 6.0 在网络处理方面上了多线程确实会让 Redis 性能上一个台阶,不过 Redis 6.0 发布还没多久,应该不会有很多企业马上上生产环境,可能还需要一段时间的优化和验证,我们再期待吧。

最后,目前最新的 6.0 版本中,IO 多线程处理模式默认是不开启的,需要去配置文件中开启并配置线程数,有兴趣的研究下吧。

猜你喜欢

转载自blog.csdn.net/dd2016124/article/details/113422734