首页 > 解决方案 > Redis 6 中的多线程 I/O 对哪些类型的工作负载有影响?

问题描述

我的基本理解是 Redis 中的所有操作都是单线程的。在 Redis-6 中有多线程 I/O。我只是好奇如果所有 I/O 线程仍然需要等待执行所有查询的单个线程,这有什么优势?我希望有人可以提供一些示例工作负载来说明优点或缺点。

标签: redis

解决方案


我的基本理解是 Redis 中的所有操作都是单线程的。

不。即使在 Redis 6 之前,也有一些后台线程,例如后台保存、异步取消链接键。

我只是好奇如果所有 I/O 线程仍然需要等待执行所有查询的单个线程,这有什么优势?

在 Redis 6 之前,Redis 使用 4 个串行步骤(在单个线程中)处理请求:

  1. 从套接字读取请求
  2. 解析它
  3. 处理它
  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


推荐阅读