当前位置: 移动技术网 > IT编程>数据库>MongoDB > Redis 到底是单线程还是多线程?我要吊打面试官!

Redis 到底是单线程还是多线程?我要吊打面试官!

2020年05月08日  | 移动技术网IT编程  | 我要评论

胎教英语,馆陶之窗,绯闻seo

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

redis是多线程还是单线程?(回答单线程的请回吧,为什么请回,请往下看)

好些粉丝在后台问我:为什么请回,redis不是单线程吗?

大家注意审题: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 多线程处理模式默认是不开启的,需要去配置文件中开启并配置线程数,有兴趣的研究下吧。

总结

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

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

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

推荐去我的博客阅读更多:

1.

2.

3.

4.

觉得不错,别忘了点赞+转发哦!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网