面试官:Redis是单线程还是多线程?(你为何怎么说都不对?) |
您所在的位置:网站首页 › 多线程和高并发面试题 › 面试官:Redis是单线程还是多线程?(你为何怎么说都不对?) |
1、前言
情景模拟: 有一天,我的一个无中生友自信地在跟面试官聊天,面试官看到这位小伙简历上写着精通Redis,一看不简单,就直接甩了个问题上来,小伙子,既然你精通Redis,那你说说Redis是单线程还是多线程?为什么Redis那么快? 这时候这位无中生友满脸笑容(这问题,太简单了),直接张口闭口就是:单线程、基于内存、k-v结构… balabala说了一大堆,但是面试官好像不太满意,这位帅小伙就很困惑,垂头丧气的就出门右拐回家去了。。。 那我现在就来为这位帅小伙解解惑吧,先把答案说出来: 1、Redis5及之前是单线程版本 2、Redis6开始引入多线程版本(实际上是 单线程+多线程 版本) 好,现在我用两张图来详细说说Redis5和Redis6在单线程和多线程版本的区别: 2、Redis5及之前版本(单线程)
同样,先亮出一张图,直接对着图来分析: Redis6引入了多线程机制,但是不是说有多个worker线程同时并发读写, 而是它有 “一个 worker线程+多个IO子线程”,其实就是在 IO 就绪之后使用多线程提升读写解析数据的效率,而在 操作内存数据的时候还是用单线程。 利用这种单线程+多线程共同运作的机制,将CPU的性能显著提升了。 同时,这种机制同样不会产生线程安全问题,因为Redis在针对数据的内存操作时,是在一个公共的worker队列中实现的,先进先出,所以不会有线程安全问题。 Redis6之所以保留worker单主线程是因为单线程机制使得Redis内部实现的复杂度大大降低,而且可以保证操作的线程安全。(如果整个过程全让子线程做了,整个任务处理过程太重,就失去了原来单线程高效处理的优势了) 简单来说,就是 “请求是多线程的,但核心的内存读写操作(或者说读写计算)仍然是单线程的”。 4、搞定收工到这里,对于Redis的单线程、多线程机制应该已经有比较深的理解了,但如果我们仔细阅读Redis源码会发现,还有一片世外桃源等待我们发现,这些就等着以后慢慢分享啦。如果本篇文章对你有所帮助,一键三连肯定一下作者咧,谢谢,我们下期见! |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |