INDEX · Redis

Redis 数据结构源码索引

阅读方法:每篇一个 C 代码块:真实 Redis 源码(本地 unstable 仓 src/ 下)+ 精炼注释,聚焦一个结构。建议先读底层结构,再读 redisObject 看它们如何被对象系统串起来,最后读运行机制。

底层数据结构

结构源码一句话
SDSsds.h/c简单动态字符串,O(1) 取长度、二进制安全、预分配,取代 C char*
dictdict.h/c哈希表,链地址法解决冲突,两张表 + 渐进式 rehash 摊薄扩容
skiplistt_zset.c跳表,多层索引,zset 底层,范围查询 O(logN)
intsetintset.c整数集合,有序数组 + 按需升级编码,全整数小 set 的紧凑存法
listpacklistpack.c紧凑列表,连续内存存多个元素,取代 ziplist,无连锁更新
quicklistquicklist.c双向链表 + 每节点一个 listpack,list 底层,平衡内存与两端操作
raxrax.c基数树(压缩前缀树),stream 的消息 ID 索引底层

进阶结构

结构源码一句话
streamt_stream.c消息队列,rax 按消息 ID 索引 + listpack 打包每段消息,支持消费者组
HyperLogLoghyperloglog.c基数估算,固定 12KB 估 2^64 量级,误差约 0.81%,可 PFMERGE 合并

对象系统

结构源码一句话
redisObjectserver.h/object.c五种类型 + 多种编码,type/encoding/refcount/lru 元信息,把上面的结构串起来

运行机制

机制源码一句话
ae事件循环ae.c单线程事件循环:epoll_wait 掐定时器超时,先文件事件后时间事件
t_zset编码转换t_zset.czadd 的编码分支:小 zset 用 listpack,超阈值转 skiplist+dict 双结构
过期与淘汰expire.c/evict.c惰性删除 + 定期采样删除;maxmemory 八种策略与近似 LRU/LFU 池采样

五种类型 → 编码映射(redisObject 决定用哪种底层结构)

类型编码(小/大)底层结构
Stringint / embstr / rawlong、SDS
Hashlistpack / hashtablelistpackdict
Listlistpack / quicklistlistpackquicklist
Setintset / listpack / hashtableintsetlistpackdict
ZSetlistpack / skiplistlistpackskiplist + dict