一、 背景
Valkey 社区于 2024 年 09 月发布了 Valkey8.0 正式版,在之前的文章《Redis 是单线程模型?》中,我们提到,Redis 社区在 Redis6.0 中引入了多线程 IO 特性,将 Redis 单节点访问请求从 10W/s 提升到 20W/s,而在 Valkey8.0 版本中,通过引入异步 IO 线程、内存预取(Prefetch)、内存访问分摊(MAA)等新特性,并且除了将读写网络数据卸载到 IO 线程执行外,还会将 event 事件循环、对象内存释放等耗时动作也卸载到 IO 线程执行,使得 Valkey 单节点访问请求可以提升到 100W/s,大幅提升 Valkey 单节点性能。
Valkey 8.0中引入的异步 IO 与 Redis 6.0 中的多线程 IO 有什么区别?Valkey8.0 中如何应用内存预取和内存访问分摊技术进一步来提升性能的?本篇文章让我们来一起看看。
- 2024 年,Redis 商业支持公司 Redis Labs 宣布 Redis 核心代码的许可证从 BSD 变更为 RSALv2 ,明确禁止云厂商提供 Redis 托管服务,这一决定直接导致社区分裂。
- 为维护开源自由,Linux 基金会联合多家科技公司(包括 AWS、Google Cloud、Oracle 等)宣布支持 Valkey ,Valkey 基于 Redis 7.2.4 开发,作为 Redis 的替代分支。
- Valkey8.0 为 Valkey 社区发布的首个主要大版本。
- 最新消息,在 Redis 项目创始人 antirez 今年加入 Redis 商业公司 5 个月后,Redis 宣传从 Redis8 开始,Redis 项目重新开源。
二、 异步 IO 线程背景
Redis6.0多线程IO
在 Redis 6.0 中引入了多线程 IO 特性,用来处理网络数据的读写和协议解析,读写数据执行流程如下所示:

在 Redis6.0 中,读数据流程是主线程先将所有可读客户端加入一个队列,全部处理完后,再通过 RR 算法将这些可读客户端分配给 IO 线程,由 IO 线程执行读数据;写数据流程类似处理。
尽管引入多线程 IO 大幅提升了 Redis 性能,但是 Redis6.0 的多线程 IO 仍然存在一些不足:
- 主线程在处理客户端命令时,IO 线程会均处于空闲状态;由于主线程会阻塞等待所有 IO 线程完成读写数据,主线程在执行 IO 相关任务期间的性能受到最慢 IO 线程速度的限制
- 由于主线程同步等待 IO 线程,IO 线程仅执行读取解析和写入操作,主线程仍然承担大部分 IO 任务
Valkey 8.0 异步 IO 线程
Valkey8.0 通过使用任务队列使主线程向 IO 线程发送任务,IO 线程异步并行执行任务提升整体性能。Valkey 8.0 异步 IO 线程工作流程整体设计图如下所示:

IO 线程初始化
在 Valkey 启动时进行初始化的时候,根据配置的线程数量server.io_threads_num 决定是否创建异步 IO 线程,如果server.io_threads_n

最低0.47元/天 解锁文章
380

被折叠的 条评论
为什么被折叠?



