Redis 究竟是单线程仍是多线程?我要吊打面试官!

最近在Java技术栈公众号发布的一篇文章,其中有一道题:java

Redis是多线程仍是单线程?(回答单线程的请回吧,为何请回,请往下看)程序员

好些粉丝在后台问我:为何请回,Redis不是单线程吗?面试

你们注意审题:Redis是多线程仍是单线程?redis

这个问题你要从多个方面回答,若是你仅仅只回答 "单线程" 确定是说不过去的,为何呢?后端

因此今天,栈长利用工做时间紧急把这个问题紧急梳理了下,但愿对你们有帮助。性能优化

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

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

下面这个解释比较好:网络

Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器。它的组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器、事件处理器。
由于文件事件分派器队列的消费是单线程的,因此Redis才叫单线程模型。
参考:https://www.jianshu.com/p/6264fa82ac33数据结构

二、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 了,若是确实没据说还好,若是据说了,还要和我杠精,我就无言以对了,对于新技术的发展和学习不就是咱们和面试官的谈资吗?

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

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

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

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

参考:https://blog.csdn.net/weixin_45583158/article/details/100143587

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

但能够知道的是,Redis 在网络处理方面上了多线程确实会让 Redis 性能上一个新台阶,不过 Redis 6.0 刚发布,不可能有企业立刻上生产环境,可能还须要一段时间的优化和验证,咱们再期待吧。

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

总结

这篇文章只是对 Redis 单线程/多线程有个基本的认识和总结,吊打面试官可能还说不上,可是在面对面试官提问的时候,不要只是单纯的说单线程,你要回答的还要比这个更多。

对于这个问题,你还有什么看法呢?欢迎留言分享哦~

最后,关注微信公众号:Java技术栈,在后台回复:吊打,能够看往期吊打面试官系列,持续更新哦。

推荐去个人博客阅读更多:

1.Java JVM、集合、多线程、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、后端、架构、阿里巴巴等大厂最新面试题

以为不错,别忘了点赞+转发哦!