redis - Redis 6 中的多线程 I/O 对哪些类型的工作负载有影响?
问题描述
我的基本理解是 Redis 中的所有操作都是单线程的。在 Redis-6 中有多线程 I/O。我只是好奇如果所有 I/O 线程仍然需要等待执行所有查询的单个线程,这有什么优势?我希望有人可以提供一些示例工作负载来说明优点或缺点。
解决方案
我的基本理解是 Redis 中的所有操作都是单线程的。
不。即使在 Redis 6 之前,也有一些后台线程,例如后台保存、异步取消链接键。
我只是好奇如果所有 I/O 线程仍然需要等待执行所有查询的单个线程,这有什么优势?
在 Redis 6 之前,Redis 使用 4 个串行步骤(在单个线程中)处理请求:
- 从套接字读取请求
- 解析它
- 处理它
- 将响应写入套接字
在完成这 4 个步骤之前,Redis 无法处理其他请求,即使有一些请求可以读取(步骤 1)。而且一般写socket的响应(第4步)很慢,所以如果我们可以在另一个IO线程(配置:)中进行写操作io-threads
,Redis可以处理更多的请求,并且速度更快。
您也可以将 Redis 设置为在另一个 IO 线程中运行第 1 步和第 2 步(配置io-threads-do-reads
:),但是,Redis 团队声称通常它没有多大帮助(通常线程读取没有多大帮助。- 引用自redis。会议)。
注意:由于第 3 步始终在单个线程中运行,因此仍保证 Redis 操作是原子的。
有人可以提供一些示例工作量来说明优点或缺点。
如果您想使用 redis-benchmark 测试 Redis 加速,请确保您还在线程模式下运行基准测试本身,使用 --threads 选项来匹配 Redis theads 的数量,否则您将无法注意到改进. -- 引用自 redis.conf
推荐阅读
- c# - 更新到 Xamarin.Forms 5.0 和 Android 10 后 Xamarin.Forms Android 错误
- c# - 使用 EventToCommandBahavior 的 Xamarin 表单选择器
- detox - 如何使用使用 detox 选择的 Android 日期?
- rancher - Rancher 的 Helm 安装因图像提取失败而失败
- anylogic - Anylogic - 使用自定义 GIS 路线绘制动画帧时出错
- vue.js - 防止 vue-router 打开相同的路径
- angular - Mat-select 输入组合对象
- sql - 如何从 SQL 中的活动日志中计算“活动用户”聚合?
- c# - 每次使用新数字重复文本 X 数量
- ios - 可点击的火种卡 SwiftUI