ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

【Redis系列2】Redis 6 的多线程

2021-08-02 10:02:08  阅读:204  来源: 互联网

标签:系列 队列 Redis 单线程 线程 串行 多线程


​昨天和同事聊Redis,他问我Redis学的怎么样,我说学的还行,然后他突然问一句“你知道Redis现在已经支持多线程了吗?”,我当时愣了一下,Redis不是一直是单线程么,怎么突然支持多线程了?瞬间感觉被秒,赶紧回来查阅一下相关资料,要不然以后都不敢说自己会Redis了

 

1. Redis知识回顾

我们先回顾一下Redis单线程模式的相关知识,我们都知道Redis快的主要原因是因为epool I/O复用模型,我们简单探讨一下:

  • 首先,Redis 是跑在单线程中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以 I/O 操作在一般情况下往往不能直接返回,这会导致某一文件的 I/O 阻塞导致整个进程无法对其它客户提供服务,而 I/O 多路复用就是为了解决这个问题而出现的。

  • 多路I/O复用模型是利用 select、poll、epoll 可以同时监听多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。

  • 这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),且 Redis 在内存中操作数据的速度非常快,也就是说内存内的操作不会成为影响Redis性能的瓶颈,主要由以上几点造就了 Redis 具有很高的吞吐量

下图是Redis的内部核心流程图(也是我能找到的比较经典的介绍Redis的原理图),内部其实主要是通过双向队列和红黑树实现(图画的很详细,里面不懂的知识,可以直接百度,很容易找到):

2. Redis单线程

对于一个请求操作,Redis主要做3件事情:从客户端读取数据、执行Redis命令、回写数据给客户端(如果再准确点,其实还包括对协议的解析)。所以主线程其实就是把所有操作的这3件事情,串行一起执行,因为是基于内存,所以执行速度非常快:

优点 VS 缺点:

优势:

a. 不存在锁的问题

b. 避免线程间CPU切换

缺点:

a. 单线程无法利用多CPU

b. 串行操作,某个操作“出问题”会“阻塞”后续操作

3. Redis多线程

Redis多线程的优化思路:因为网络I/O在Redis执行期间占用了大部分CPU时间,所以把网络I/O部分单独抽离出来,做成多线程的方式。

这里所说的多线程,其实就是将Redis单线程中做的这两件事情“从客户端读取数据、回写数据给客户端”(也可以称为网络I/O),处理成多线程的方式,但是“执行Redis命令”还是在主线程中串行执行,这个逻辑保持不变。

可能有同学会问,主线程和多个I/O线程,都同时处理图中的“队列”,是不是会存在锁竞争的关系呢?这里有个巧妙的设计,就是当epoll获取socket链接时,会将该事件先全部扔进队列中,比如扔了N个事件,这时主线程就会处于忙等(spinlock自旋锁的效果)状态。然后多个I/O线程开始去并行进行网络I/O,并对数据进行协议解析,当队列全部处理完毕后,主线程会对队列中请求串行““执行Redis命令”,然后清空该队列。所以整个执行流程总结下来:主线程执行请求入队列 -> I/O线程并行进行网络读 -> 主线程串行执行Redis命令 -> I/O线程并行进行网络写 -> 主线程清空队列,并接收下一批请求。

优点 VS 缺点

优点:

a. 提高响应速度,充分使用CPU

缺点:

a. 增加了代码复杂性

4. 总结

  • Redis的多路复用技术,支持epoll、kqueue、selector;

  • 5.0版本及以前,处理客户端请求的线程只有一个,串行处理;

  • 6.0版本引入了worker Thread,只处理网络IO读取和写入,核心IO负责串行处理客户端指令。

标签:系列,队列,Redis,单线程,线程,串行,多线程
来源: https://blog.csdn.net/lml200701158/article/details/119213480

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有