INDEX · Redis
Redis 数据结构源码索引
阅读方法:每篇一个 C 代码块:真实 Redis 源码(本地 unstable 仓 src/ 下)+ 精炼注释,聚焦一个结构。建议先读底层结构,再读 redisObject 看它们如何被对象系统串起来,最后读运行机制。
底层数据结构
| 结构 | 源码 | 一句话 |
|---|
| SDS | sds.h/c | 简单动态字符串,O(1) 取长度、二进制安全、预分配,取代 C char* |
| dict | dict.h/c | 哈希表,链地址法解决冲突,两张表 + 渐进式 rehash 摊薄扩容 |
| skiplist | t_zset.c | 跳表,多层索引,zset 底层,范围查询 O(logN) |
| intset | intset.c | 整数集合,有序数组 + 按需升级编码,全整数小 set 的紧凑存法 |
| listpack | listpack.c | 紧凑列表,连续内存存多个元素,取代 ziplist,无连锁更新 |
| quicklist | quicklist.c | 双向链表 + 每节点一个 listpack,list 底层,平衡内存与两端操作 |
| rax | rax.c | 基数树(压缩前缀树),stream 的消息 ID 索引底层 |
进阶结构
| 结构 | 源码 | 一句话 |
|---|
| stream | t_stream.c | 消息队列,rax 按消息 ID 索引 + listpack 打包每段消息,支持消费者组 |
| HyperLogLog | hyperloglog.c | 基数估算,固定 12KB 估 2^64 量级,误差约 0.81%,可 PFMERGE 合并 |
对象系统
| 结构 | 源码 | 一句话 |
|---|
| redisObject | server.h/object.c | 五种类型 + 多种编码,type/encoding/refcount/lru 元信息,把上面的结构串起来 |
运行机制
| 机制 | 源码 | 一句话 |
|---|
| ae事件循环 | ae.c | 单线程事件循环:epoll_wait 掐定时器超时,先文件事件后时间事件 |
| t_zset编码转换 | t_zset.c | zadd 的编码分支:小 zset 用 listpack,超阈值转 skiplist+dict 双结构 |
| 过期与淘汰 | expire.c/evict.c | 惰性删除 + 定期采样删除;maxmemory 八种策略与近似 LRU/LFU 池采样 |
五种类型 → 编码映射(redisObject 决定用哪种底层结构)