1. Redis核心数据结构深度解析
Redis作为高性能键值数据库,其丰富的数据结构是支撑各类业务场景的基石。让我们深入剖析每种数据结构的实现原理与典型应用。
1.1 String类型:二进制安全的存储利器
String是Redis最基础的数据类型,但其实现远比表面复杂。Redis采用SDS(Simple Dynamic String)结构而非C原生字符串,核心原因在于二进制安全需求。传统C字符串以'\0'作为结束标识,无法存储包含'\0'的二进制数据(如图片、序列化对象)。SDS通过三个关键设计解决这个问题:
c复制struct sdshdr {
int len; // 已使用字节数
int free; // 未使用字节数
char buf[]; // 实际数据存储
};
内存优化演进:Redis 3.2后引入五种sdshdr类型(sdshdr5/8/16/32/64),根据字符串长度自动选择最节省内存的结构体,并通过__attribute__ ((__packed__))取消内存对齐,极致节省内存。
生产建议:存储超过100KB的大对象时,考虑分片存储或使用Hash结构,避免大Key问题。
1.2 Hash类型:对象存储的最佳实践
Hash结构适合存储对象类型数据,其底层实现经历重要演进:
- Redis 7.0前:使用ziplist(元素少时)和hashtable
- Redis 7.0+:采用listpack替代ziplist,解决连锁更新问题
python复制# 典型使用场景 - 用户信息存储
HSET user:1001 name "张三" age 28 profession "工程师"
HGET user:1001 age # 获取特定字段
性能对比测试:
| 操作类型 | ziplist(100字段) | hashtable(100字段) |
|---|---|---|
| HGET | O(n) | O(1) |
| 内存占用 | ~2KB | ~5KB |
