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 进阶教程。数据结构基础(链表、哈希表、跳跃表)会有助于理解,但文中会从头讲解。

目录

序号文章核心内容
0101 Redis 全局架构——一次请求的完整生命周期整体模块划分、一条 SET 命令的全链路、redisServer/redisDb/redisObject 核心结构体、key 空间与过期字典
0202 SDS 与 Redis 对象系统SDS 的 sdshdr5/8/16/32/64 五种头结构、空间预分配、RedisObject 的 type/encoding 矩阵、对象共享池、LRU/LFU 时钟
0303 字典与渐进式 RehashdictEntry/dictht/dict 三层结构、MurmurHash2、链地址法、渐进式 Rehash 双表交替、Rehash 对 SCAN 的影响
0404 跳跃表 压缩列表与 ListpackSkiplist 概率平衡与 ZSet 双索引、Ziplist 连锁更新问题、Listpack 的改进、QuickList 设计、encoding 升级触发
0505 单线程模型与事件驱动架构为什么选择单线程、ae 事件库跨平台封装、文件事件与时间事件、Redis 6.0 多线程 IO 的设计与局限
0606 内存管理与过期淘汰策略jemalloc 与内存碎片、编码优化阈值、惰性删除与定期删除、八种淘汰策略、LRU 近似算法与 LFU Morris Counter
0707 RDB 持久化——快照的 fork 与 COW 机制SAVE vs BGSAVE、fork() 与 COW 内存代价、RDB 二进制格式、自动触发条件、子进程交互
0808 AOF 持久化与混合持久化命令追加/文件写入/文件同步三步流程、三种 fsync 策略、AOF 重写的 fork + 重写缓冲区、混合持久化
0909 主从复制与 Sentinel 高可用全量同步与增量同步(PSYNC2)、复制积压缓冲区、Sentinel 故障检测/Leader Election/自动 Failover、脑裂防护
1010 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 协议