Redis 设计与实现专栏导览
专栏定位
Redis 的接口简洁到极致——五种数据类型、几十个核心命令,任何开发者都能快速上手。但 Redis 的内部世界远比接口复杂:一个 String 类型在底层可能是 int、embstr 或 raw 三种编码中的任意一种;一个 ZSet 在元素少时用 ziplist/listpack 存储、元素多时切换为 skiplist + dict 的双索引结构;一次 BGSAVE 触发了 fork() 系统调用,父子进程通过 Copy-on-Write 共享内存页;一次主从全量同步需要生成 RDB、传输、加载,期间的增量命令暂存在复制积压缓冲区中……
本专栏聚焦 Redis 的数据结构设计、架构决策与内核实现——从 SDS 的五种头结构到渐进式 Rehash 的双表设计,从单线程事件循环到 6.0 多线程 IO 的工程权衡,从 RDB 的 fork + COW 机制到 Cluster 的 Gossip 协议。每篇文章不仅告诉你”Redis 是怎么做的”,更要回答”为什么这么做”以及”不这么做会怎样”。
前置知识:熟悉 Redis 基本操作。实战用法可参考姊妹专栏 Redis 进阶教程。数据结构基础(链表、哈希表、跳跃表)会有助于理解,但文中会从头讲解。
目录
| 序号 | 文章 | 核心内容 |
|---|---|---|
| 01 | 01 Redis 全局架构——一次请求的完整生命周期 | 整体模块划分、一条 SET 命令的全链路、redisServer/redisDb/redisObject 核心结构体、key 空间与过期字典 |
| 02 | 02 SDS 与 Redis 对象系统 | SDS 的 sdshdr5/8/16/32/64 五种头结构、空间预分配、RedisObject 的 type/encoding 矩阵、对象共享池、LRU/LFU 时钟 |
| 03 | 03 字典与渐进式 Rehash | dictEntry/dictht/dict 三层结构、MurmurHash2、链地址法、渐进式 Rehash 双表交替、Rehash 对 SCAN 的影响 |
| 04 | 04 跳跃表 压缩列表与 Listpack | Skiplist 概率平衡与 ZSet 双索引、Ziplist 连锁更新问题、Listpack 的改进、QuickList 设计、encoding 升级触发 |
| 05 | 05 单线程模型与事件驱动架构 | 为什么选择单线程、ae 事件库跨平台封装、文件事件与时间事件、Redis 6.0 多线程 IO 的设计与局限 |
| 06 | 06 内存管理与过期淘汰策略 | jemalloc 与内存碎片、编码优化阈值、惰性删除与定期删除、八种淘汰策略、LRU 近似算法与 LFU Morris Counter |
| 07 | 07 RDB 持久化——快照的 fork 与 COW 机制 | SAVE vs BGSAVE、fork() 与 COW 内存代价、RDB 二进制格式、自动触发条件、子进程交互 |
| 08 | 08 AOF 持久化与混合持久化 | 命令追加/文件写入/文件同步三步流程、三种 fsync 策略、AOF 重写的 fork + 重写缓冲区、混合持久化 |
| 09 | 09 主从复制与 Sentinel 高可用 | 全量同步与增量同步(PSYNC2)、复制积压缓冲区、Sentinel 故障检测/Leader Election/自动 Failover、脑裂防护 |
| 10 | 10 Redis Cluster 分布式架构 | 哈希槽分片(16384 slots)、Gossip 协议、MOVED/ASK 重定向、槽迁移、故障检测与 Failover、Hash Tag、与 Proxy 方案对比 |
推荐阅读路径
- 数据结构爱好者:02 → 03 → 04(SDS → 字典 → 跳跃表/压缩列表)
- 架构理解:01 → 05 → 06(全局架构 → 事件循环 → 内存管理)
- 持久化与容灾:07 → 08 → 09(RDB → AOF → 主从/Sentinel)
- 分布式:09 → 10(复制 → Cluster)
- 全链路通读:01 → 02 → 03 → 04 → 05 → 06 → 07 → 08 → 09 → 10
关联专栏
- Redis 进阶教程:基于底层原理的实战应用(缓存、分布式锁、消息队列)
- 内存管理:Redis 内存管理与 jemalloc、Page Cache 的关系
- 网络协议栈:Redis 事件循环基于 epoll 实现
- 进程管理:RDB fork() 与 COW 机制依赖进程管理知识
- 分布式共识:Redis Sentinel/Cluster 的 Leader Election 与 Gossip 协议