1. Redis 的五大基础数据结构,String、Hash、List、Set、ZSet 的底层实现?
请说明 Redis 的 String、Hash、List、Set、ZSet 五种基础数据结构的命令语义,以及它们各自的底层内存实现(编码方式)是什么?
- 五种数据结构的命令与典型使用场景
- 每种结构对应的底层编码(SDS、listpack、hashtable、skiplist、intset、quicklist)
- 编码随数据规模动态切换的机制
String 底层用 SDS(简单动态字符串),支持 bit 操作、数值自增,是最通用的结构;Hash 底层是小数据时用 listpack(ziplist),数据量大后切换为 hashtable(字典);List 底层用 quicklist(双向链表 + listpack 节点)或 listpack;Set 底层在小整数集合时用 intset,否则用 hashtable;ZSet 底层用 ziplist/listpack 存储有序小集合,数据量大后切换为 skiplist + hashtable 组合。Redis 通过对象编码(encoding)字段动态选择最小内存但功能足够的底层实现,并在数据规模跨过阈值时原地格式转换。
多种编码是为了在小数据量时节省内存(紧凑连续存储、无指针),在数据量增大时用哈希表/跳表保证 O(1)/O(logN) 的访问性能,体现"内存换性能"与"性能换内存"的权衡。
# 观察对象编码
127.0.0.1:6379> SET num 12345
OK
127.0.0.1:6379> OBJECT ENCODING num
"int"
127.0.0.1:6379> SET big "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
OK
127.0.0.1:6379> OBJECT ENCODING big
"embstr"