1.9 KiB
1.9 KiB
title, date, category, tags, excerpt
| title | date | category | tags | excerpt | |||
|---|---|---|---|---|---|---|---|
| Redis 进阶:数据结构底层实现与集群方案 | 2026-05-20 | 数据库 |
|
从 SDS、ziplist、skiplist 等底层数据结构讲起,到 RDB/AOF 持久化、哨兵模式、Cluster 集群。 |
一、底层数据结构
1.1 简单动态字符串(SDS)
Redis 没有使用 C 语言的字符串,而是自己实现了 SDS:
- 二进制安全
- 杜绝缓冲区溢出
- 获取字符串长度 O(1)
- 空间预分配和惰性释放
1.2 压缩列表(ziplist)
连续内存块组成的顺序存储结构,节约内存:
[zlbytes][zltail][zllen][entry...][zlend]
当列表元素较少或元素较小时使用。Redis 7.0 后被 listpack 替代。
1.3 跳跃表(skiplist)
有序集合的底层实现之一,平均 O(log n) 的查找效率:
typedef struct zskiplistNode {
sds ele; // 成员对象
double score; // 分值
zskiplistNode *backward; // 后退指针
zskiplistLevel {
zskiplistNode *forward;
unsigned long span;
} level[];
} zskiplistNode;
二、持久化机制
2.1 RDB
快照方式,将某一时刻的内存数据写入磁盘:
save 900 1 # 900秒内至少1个key变化
save 300 10 # 300秒内至少10个key变化
2.2 AOF
记录每次写操作命令,重启时重放:
appendfsync always— 每条命令都同步appendfsync everysec— 每秒同步(推荐)appendfsync no— 由操作系统决定
生产环境建议 RDB + AOF 同时开启,取长补短。
三、集群方案
3.1 哨兵模式
监控主节点,自动故障转移。最少需要 3 个哨兵节点。
3.2 Cluster 集群
数据分片,16384 个哈希槽分布在多个节点。支持水平扩展。
四、总结
理解底层数据结构有助于合理选择数据类型和预估内存占用。生产环境要做好持久化和高可用方案。