暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

啊泽Coding 2021-06-21
483

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



01

前言

情景模拟:

    有一天,我的一个无中生友自信地在跟面试官聊天,面试官看到这位小伙简历上写着精通 Redis,一看不简单,就直接甩了个问题上来,小伙子,既然你精通 Redis,那你说说 Redis 是单线程还是多线程?再说说为什么 Redis 那么快?

这时候这位无中生友满脸笑容(这问题,太简单了),直接张口闭口就是:单线程、基于内存、k-v 结构…

balabala 说了一大堆,但是面试官好像不太满意,这位帅小伙就很困惑,垂头丧气的就出门右拐回家去了。。。



那我们现在就来为这位帅小伙解解惑吧,先把答案放出来:

  1. Redis5 及之前是单线程版本

  2. Redis6 开始引入多线程版本(实际上是 单线程 + 多线程 版本)

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



02


Redis5 及之前版本(单线程)



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

所以也就在 Redis6 引入了多线程版本,接着往下看。



03


Redis6(单线程 + 多线程)

同样,先亮出一张图,直接对着图来分析:


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

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

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

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



04


搞定收工

    到这里,对于 Redis 的单线程、多线程机制大家应该已经有比较深的理解了,但如果我们仔细阅读 Redis 源码会发现,还有一片世外桃源等待我们发现,这些就等着以后慢慢分享啦。

    如果本篇文章对你有所帮助,点赞在看收藏一键三连肯定一下作者,谢谢,我们下期见!


我是啊泽,一枚有趣的程序员,关注我,为你带来更多技术干货!


文章转载自啊泽Coding,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论