面试官:Redis是单线程还是多线程?(你为何怎么说都不对?)

1、前言

情景模拟:
有一天,我的一个无中生友自信地在跟面试官聊天,面试官看到这位小伙简历上写着精通Redis,一看不简单,就直接甩了个问题上来,小伙子,既然你精通Redis,那你说说Redis是单线程还是多线程?为什么Redis那么快?
这时候这位无中生友满脸笑容(这问题,太简单了),直接张口闭口就是:单线程、基于内存、k-v结构…
balabala说了一大堆,但是面试官好像不太满意,这位帅小伙就很困惑,垂头丧气的就出门右拐回家去了。。。

那我现在就来为这位帅小伙解解惑吧,先把答案说出来:
1、Redis5及之前是单线程版本
2、Redis6开始引入多线程版本(实际上是 单线程+多线程 版本)

好,现在我用两张图来详细说说Redis5和Redis6在单线程和多线程版本的区别:

2、Redis5及之前版本(单线程)

在这里插入图片描述
Redis5及之前的版本使用的是 单线程,也就是说只有一个 worker队列,所有的读写操作都要在这一个队列进行操作,好处是不会有线程安全问题(因为它在读写时就只有一个线程,那对于读写操作肯定没有线程安全问题啊!),但是读写 write、read 这些系统调用在Redis执行期间占用了大部分的 CPU 时间,所以这就是单线程模式的缺点
所以也就在Redis6引入了多线程版本,接着往下看。



3、Redis6(单线程+多线程)

同样,先亮出一张图,直接对着图来分析:
在这里插入图片描述

  • Redis6引入了多线程机制,但是不是说有多个worker线程同时并发读写, 而是它有 “一个 worker线程+多个IO子线程”,其实就是在 IO 就绪之后使用多线程提升读写解析数据的效率,而在 操作内存数据的时候还是用单线程
    利用这种单线程+多线程共同运作的机制,将CPU的性能显著提升了。

  • 同时,这种机制同样不会产生线程安全问题,因为Redis在针对数据的内存操作时,是在一个公共的worker队列中实现的,先进先出,所以不会有线程安全问题。

  • Redis6之所以保留worker单主线程是因为单线程机制使得Redis内部实现的复杂度大大降低,而且可以保证操作的线程安全。(如果整个过程全让子线程做了,整个任务处理过程太重,就失去了原来单线程高效处理的优势了)

  • 简单来说,就是 “请求是多线程的,但核心的内存读写操作(或者说读写计算)仍然是单线程的”。

4、搞定收工

到这里,对于Redis的单线程、多线程机制应该已经有比较深的理解了,但如果我们仔细阅读Redis源码会发现,还有一片世外桃源等待我们发现,这些就等着以后慢慢分享啦。如果本篇文章对你有所帮助,一键三连肯定一下作者咧,谢谢,我们下期见!

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页