当前位置:网站首页>Redis 6 的多线程
Redis 6 的多线程
2022-08-03 12:47:00 【云满笔记】
1. Redis 6 的多线程
昨天和同事聊 Redis, 他问我 Redis 学的怎么样, 我说学的还行, 然后他突然问一句"你知道 Redis 现在已经支持多线程了吗? ", 我当时愣了一下, Redis 不是一直是单线程么, 怎么突然支持多线程了? 瞬间感觉被秒, 赶紧回来查阅一下相关资料, 要不然以后都不敢说自己会 Redis 了
1.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 的原理图), 内部其实主要是通过双向队列和红黑树实现(图画的很详细, 里面不懂的知识, 可以直接百度, 很容易找到):
1.2. Redis 单线程
对于一个请求操作, Redis 主要做 3 件事情: 从客户端读取数据、执行 Redis 命令、回写数据给客户端(如果再准确点, 其实还包括对协议的解析)。所以主线程其实就是把所有操作的这 3 件事情, 串行一起执行, 因为是基于内存, 所以执行速度非常快:
优点 VS 缺点:
- 优势: a. 不存在锁的问题 b. 避免线程间 CPU 切换
- 缺点: a. 单线程无法利用多 CPUb. 串行操作, 某个操作"出问题"会"阻塞"后续操作
1.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. 增加了代码复杂性
1.4. 总结
- Redis 的多路复用技术, 支持 epoll、kqueue、selector;
- 5.0 版本及以前, 处理客户端请求的线程只有一个, 串行处理;
- 6.0 版本引入了 worker Thread, 只处理网络 IO 读取和写入, 核心 IO 负责串行处理客户端指令。
边栏推荐
- 一些测试相关知识
- YOLOv5 training data prompts No labels found, with_suffix is used, WARNING: Ignoring corrupted image and/or label appears during yolov5 training
- Image fusion GAN-FM study notes
- 浅谈低代码平台远程组件加载方案
- self-discipline
- Tinymce plugins [Tinymce扩展插件集合]
- AMS simulation
- An工具介绍之骨骼工具
- Image fusion DDcGAN study notes
- GameFi industry down but not out | June Report
猜你喜欢

IDEA的模板(Templates)

【精品必知】Pod生命周期

基于php家具销售管理系统获取(php毕业设计)

Feature dimensionality reduction study notes (pca and lda) (1)

ECCV 2022 | AirDet: 无需微调的小样本目标检测方法

In order to counteract the drop in sales and explore the low-end market, Weilai's new brand products are priced as low as 100,000?

什么是分布式锁?几种分布式锁分别是怎么实现的?

云计算服务主要安全风险及应对措施初探

How does Filebeat maintain file state?

浅谈程序员的职业操守
随机推荐
7月份最后一篇博客
使用工作队列管理器(三)
Mysql重启后innodb和myisam插入的主键id变化总结
8/2 训练日志(dp+思维+字典树)
An introduction to basic tools for selecting line tools (package church)
Image fusion GAN-FM study notes
Oracle安装完毕(系统盘),从系统盘转移到数据盘
自律成就自己
Classes and Objects (lower middle)
第十五章 源代码文件 REST API 简介
GameFi 行业下滑但未出局| June Report
【R】用grafify搞定统计绘图、方差分析、干预比较等!
【Verilog】HDLBits题解——Circuits/Sequential Logic/Latches and Flip-Flops
An工具介绍之宽度工具、变形工具与套索工具
(通过页面)阿里云云效上传jar
层次分析法
An introduction to 3D tools
字节最爱问的智力题,你会几道?
Real number rounding and writing to file (C language file)
B站回应“HR 称核心用户都是 Loser”:该面试官去年底已被劝退,会吸取教训加强管理