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 embstrraw 的触发条件

三、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-entrieshash-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 编码切换的性能影响

九、总结

  • 内部编码的设计哲学——“空间换时间”和”时间换空间”的动态平衡
  • 配置参数的调优建议