Redis / 缓存内核:事件循环 · 对象编码 · 淘汰 · RDB/AOF · Cluster
读者读完 缓存架构
的 Cache-Aside / 击穿雪崩,或 缓存工程
的多级缓存之后,对「怎么用 Redis」往往已经有直觉,但对
一条命令如何经事件循环落到内存对象、encoding
如何升级、maxmemory 近似 LRU 与真 LRU
差在哪、AOF everysec 实际丢什么
仍缺源码级地图。站内 linux/redis-source
是 Redis 4.0 Org 情景漫游,不能替代 7.4/8.x
生产路径。
本系列不写 Spring Cache cookbook,也不重复 architecture/17 的五种读写模式全文,写:
aeEventLoop、客户端缓冲、IO threads 边界与「单线程」精确含义。redisObject/ SDS / dict / listpack / quicklist / ZSet skiplist / Stream。- TTL 过期与
maxmemory近似 LRU/LFU。 - RDB / AOF / 混合持久化与 fsync 语义(对读 fsync 失败真相)。
- 复制、Cluster 16384 slot,以及 Memcached 对照选型。
系列状态:已完成(2026-07-13)。全 16 篇正文均已发布,可点进阅读。
版本锚定:Redis OSS 7.4 / 8.x(源码路径与官方文档);Memcached 作第 14 篇对照。本机实验以
redis-server为准;未部署时不伪造INFO/ benchmark 数字。
适合谁看
- 后端 / 平台工程师:运维 Redis,排查大 key、fork 延迟、AOF 堆积、Cluster 重定向。
- 从 architecture/17 过来的读者:已会旁路缓存,要下沉到服务器内核。
- 从算法篇过来的读者:已会跳表 / 哈希 / LRU,要看 Redis 工程编码与近似淘汰。
- DBA / 可靠性:要钉清 RDB/AOF 与 fsync 的丢失窗口。
推荐阅读路径
| 路径 | 篇目 | 适合 |
|---|---|---|
| 从缓存架构下沉 | 1 → 2 → 3 → 8 → 11 → 16 | 后端 / 平台 |
| 数据结构专项 | 3 → 4 → 5 → 6 | 从算法篇来 |
| 持久化专项 | 9 → 10 → 11 → 15 | DBA / 可靠性 |
| Cluster 专项 | 2 → 12 → 13 → 16 | 集群运维 |
| 完整通读 | 1 → … → 16 | 系统掌握 |
一、五个关键问题
- 内存里的「一个 key」实际是什么编码? → 第 1、3、4、5、6 篇
- 一条命令如何从 socket 落到对象突变?单线程神话边界在哪? → 第 2、15 篇
maxmemory淘汰与 TTL 过期如何近似实现?与 OS/算法篇 LRU 差在哪? → 第 7、8 篇- RDB / AOF / 混合持久化各自保证什么?fsync 失败语义如何落到配置? → 第 9、10、11 篇(对读 fsyncgate、data-integrity)
- 主从与 Cluster 如何改写多 key 原子性?何时该上 Memcached? → 第 12、13、14、16 篇
二、篇目依赖
flowchart TD
A["01 缓存服务器全景"] --> B["02 事件循环与 I/O"]
B --> C["03 对象模型与 SDS"]
C --> D["04 Dict 渐进 rehash"]
D --> E["05 紧凑编码"]
E --> F["06 ZSet 与 Stream"]
F --> G["07 TTL 与过期"]
G --> H["08 maxmemory 淘汰"]
H --> I["09 RDB"]
I --> J["10 AOF"]
J --> K["11 混合持久化"]
K --> L["12 复制"]
L --> M["13 Cluster"]
M --> N["14 Memcached 对照"]
N --> O["15 生产排障"]
O --> P["16 选型阅读地图"]
跨系列:architecture/17 → 01/14/16;algorithms/07,18 → 04/06;fsyncgate → 11。
三、目录与每篇价值点
第一部分:模型与执行路径
- 缓存服务器全景:HashMap
· Memcached · Redis · 嵌入 KV
- 四类内存 KV 生态位;与 architecture/17、storage/66、旧 redis-source 分工;16 篇地图。
- 事件循环与
I/O:ae · 客户端缓冲 · IO threads
- 「单线程」精确含义;文件/时间事件;IO threads 只卸载读写不执行命令。
第二部分:内存数据结构
- 对象模型与
SDS:redisObject · type · encoding
- 多态编码入口;SDS
二进制安全与头部布局;
OBJECT ENCODING。
- 多态编码入口;SDS
二进制安全与头部布局;
- Dict 与渐进
rehash:双 ht 与摊销扩容
- 对读 algorithms/07;rehash 步进如何避免延迟尖刺。
- 紧凑编码:listpack
· quicklist · intset
- ziplist 历史边界;小集合省内存、大集合升级触发。
- ZSet 与
Stream:skiplist · rax · 消费组
- Pugh 跳表工程落地;Stream 最小必要集(不扩成 MQ 全书)。
第三部分:过期、淘汰与内存
- TTL
与过期:惰性删除 · 主动采样 · lazyfree
- expires dict;定时采样偏差;异步释放与延迟。
- maxmemory
策略:近似 LRU/LFU 与 MEMORY DOCTOR
- volatile/allkeys 矩阵;与真 LRU/ARC 对照;淘汰不等于过期。
第四部分:持久化
- RDB:fork COW ·
BGSAVE · 快照格式
- 子进程快照代价;无盘场景边界。
- AOF:命令日志 ·
rewrite · appendfsync
- always / everysec / no 丢失窗口;rewrite 尖刺。
- 混合持久化与崩溃语义
- RDB preamble + AOF;对读 fsyncgate;配置决策树。
第五部分:复制、集群与收束
- 复制:PSYNC ·
backlog · 副本语义
- 全量/部分重同步;副本滞后与读己之写。
- Cluster:16384 slot ·
MOVED/ASK · 多 key 约束
- 服务端 hash slot vs 客户端一致性哈希;同槽原子性边界。
- Memcached
对照:多线程 · slab · 纯缓存
- 何时 vs 数据结构丰富度;何时不该上 Redis。
- 生产排障:大
key · fork · 慢日志 · 碎片
LATENCY/SLOWLOG/INFO可读信号;本机复现清单。
- 选型与阅读地图
- standalone / Sentinel / Cluster;Valkey 一句;模块边界;开放争论。
四、与相邻系列的分工
| 话题 | 本系列 | 相邻系列 |
|---|---|---|
| Cache-Aside / 击穿雪崩 | 引用,不重写 | architecture/17 |
| 多级缓存工程 | 引用 | storage/66 |
| 跳表 / 哈希证明 | 引用 | algorithms/18、07 |
| fsync 失败语义 | 第 11 篇落地配置 | fsyncgate |
| Redis 4.0 情景 | 第 1 篇历史入口 | linux/redis-source |
| 磁盘 LSM 嵌入 KV | 第 1 篇对照 | rocksdb |
参考
- 系列规划(PLAN.md)(写作执行文档,非发布页)
- 数据库内核索引
- 全部系列索引
返回 数据库索引 · 缓存架构 · RocksDB 内核
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【Redis / 缓存内核】缓存服务器全景:HashMap · Memcached · Redis · 嵌入 KV
定位进程内 HashMap、Memcached、Redis 与 RocksDB 嵌入 KV 在内存缓存栈中的生态位;划分与 architecture/17、storage/66、linux/redis-source 的分工,并给出本系列 16 篇阅读地图。
【Redis / 缓存内核】ZSet 与 Stream:skiplist · rax · 消费组
Redis 7.4/8.x 有序集合的双结构 skiplist+dict 与小 listpack 编码、Pugh 跳表参数如何落地,以及 Stream 的 rax+listpack 存储与 consumer group / PEL 的最小必要语义——不扩写消息队列教科书。
【Redis / 缓存内核】RDB:fork COW · BGSAVE · 快照格式
从 rdb.c 拆解 SAVE/BGSAVE 的 fork 写时复制语义、子进程快照路径,以及 REDIS 魔数与 opcode 锚定的 RDB 格式边界。
【Redis / 缓存内核】AOF:命令日志 · rewrite · appendfsync
从 aof.c 拆解 AOF 多段清单、feedAppendOnlyFile 写路径、后台 rewrite 与 appendfsync always/everysec/no 各自的丢失窗口及 fsync 失败语义。