Redis String 类型详解
Redis 的 String 类型能存数字、能存 JSON、能存二进制,底层到底用了什么数据结构?其他类型的内部编码又是什么?
一、RedisObject——一切数据的基础
- 1.1
type——对外暴露的类型(String/List/Hash/Set/ZSet) - 1.2
encoding——内部编码(int/embstr/raw/ziplist/skiplist 等) - 1.3
ptr——指向实际数据的指针 - 1.4
refcount——引用计数,用于共享对象
二、String 的三种内部编码
- 2.1
int——整数值,直接存储在 ptr 中 - 2.2
embstr——短字符串(≤ 44 字节),连续内存分配 - 2.3
raw——长字符串,两次内存分配 - 2.4
embstr转raw的触发条件
三、SDS(简单动态字符串)
- 3.1 SDS 的数据结构——
len/free/buf[] - 3.2 与 C 字符串的区别——O(1) 获取长度、二进制安全、杜绝缓冲区溢出
- 3.3 空间预分配与惰性空间释放
- 3.4 SDS 在 Redis 各版本的变化
四、Hash 的两种内部编码
- 4.1
ziplist——压缩列表,节省内存 - 4.2
hashtable——字典,高效的查找 - 4.3
hash-max-ziplist-entries与hash-max-ziplist-value阈值
五、List 的两种内部编码
- 5.1
ziplist——小列表 - 5.2
quicklist——链表 + ziplist 的结合(Redis 3.2+) - 5.3
linkedlist——已废弃
六、Set 的两种内部编码
- 6.1
intset——整数集合 - 6.2
hashtable——字典
七、ZSet 的两种内部编码
- 7.1
ziplist——小有序集合 - 7.2
skiplist + dict——跳表 + 字典的组合 - 7.3 跳表的原理——多层索引实现 O(log n) 查找
八、使用 OBJECT ENCODING 命令实战
- 8.1 观察不同数据量下的编码变化
- 8.2 编码切换的性能影响
九、总结
- 内部编码的设计哲学——“空间换时间”和”时间换空间”的动态平衡
- 配置参数的调优建议
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 谜思录!