Valkey 源码解析
This content is not available in your language yet.
Valkey 不是“把 Redis 改名后继续维护”的简单快照,而是从 Redis 7.2 兼容基线继续演进的独立服务端。本册只抓最值得对照阅读的部分:分叉如何保持兼容、主线程如何继续拥有数据状态,以及 IO 多线程究竟把什么工作移出了事件循环。
本册问题地图
Section titled “本册问题地图”Valkey 的阅读重点不是列出它“比 Redis 多了哪些线程”,而是理解它在保持 Redis 核心语义的前提下,怎样把可并行的工作拆出去:
- 哪些工作可以并行,哪些仍必须由主线程决定? 命令状态修改与网络读写、后台 I/O 的边界在哪里。
- IO worker 和 BIO worker 为什么不是同一种队列? 消费者数量、任务方向和完成通知方式如何不同。
- fork、后台线程和多线程 I/O 分别解决什么问题? 它们的隔离方式、内存语义和故障边界不能混为一谈。
- 如何读分叉项目? 先建立共同基线,再定位兼容层、并发改造点和行为差异,而不是把所有 diff 当成同等重要。
- 源码:
E:\source\redis\valkey - 分支:
unstable - Commit:
8cd535ddb3dc80aceb154e6ef9dbe11d256e2209(2026-08-13) - 最近祖先 tag:
8.0.8(仅作仓库快照参考) - 兼容基线:
src/version.h保留REDIS_VERSION 7.2.4,产品版本由VALKEY_VERSION表示
六页读码路线
Section titled “六页读码路线”server.c 主线程、命令执行、事件循环、cronio_threads.c socket read/write、poll、accept 的 IO workerbio.c 后台 I/O、lazy free 等 BIO 任务threads_mngr.c 线程创建、暂停、唤醒与生命周期管理fork.c RDB/AOF/Module 等 fork 子进程协作version.h Valkey 版本与 Redis 兼容基线先建立一个判断
Section titled “先建立一个判断”网络字节流 / socket 状态 -> 可并行,交给 IO worker命令解析后的数据结构 mutation -> 主线程,保持单一所有权文件 I/O、释放大对象 -> BIO 或 fork 子进程因此 Valkey 的多线程不是“多线程执行 Redis 命令”。更准确的描述是:在不改变核心数据状态模型的前提下,扩大网络 IO 的吞吐窗口。
先读 Redis 事件循环与单线程模型,再看本册的 IO Threads。与 Netty 对照时,重点不是都用了线程,而是比较“任务所有权”和“队列边界”放在哪里。