redis数据结构与底层实现

redis数据结构和底层实现

参考书籍:《redis设计与实现》

1. redis基本数据结构

  1. String,字符串
  2. Hash,字典
  3. List,列表
  4. Set,集合
  5. Sorted Set,有序集合

快速预览

String对象底层编码有int、raw或者embstr,如果存整数用int、存字符串但是长度较长用raw、存字符串但是长度较短用embstr。
哈希对象的底层编码可以用ziplist和hashtable,根据键值对字符串长度和数量选择,短而少选前者,否则反之。
列表对象的底层编码可以是ziplist或者linkedlist,同样根据保存元素的长度和数量选择二者,短而少就选ziplist,否则反之。
集合对象的底层编码可以是intlist或者hashtable,如果说元素全部是整数且个数小于512就选择intlist,否则选择hashtable。
有序集合的底层编码可以是ziplist或者skiplist+dict,同样ziplist适合元素短而少的场景。

2. String对象使用场景与底层实现

1.使用场景

简单的key-value类型,value不仅可以是字符串还可以是数字。

  • 原子计数器
  • 支持append
  • 支持O(1)时间获取字符串长度
  • 支持获取子串

2. 底层实现

String对象的底层编码可以使用int、raw或者embstr实现。

1. int编码

如果一个字符串对象保存的是整数值,并且这个整数值可以使用long类型来表示,那么字符串对象的底层编码就可以设置为int

2. raw编码

如果一个字符串对象保存的是字符串值,且这个字符串值的长度大于32字节,那么字符串对象将使用raw编码的方式来保存这个字符串值。
字符串对象将使用一个简单动态字符串(SDS)来保存这个字符串值,并将这个对象编码设置为raw.

string-raw

3. embstr编码

如果一个字符串对象保存的是字符串值,且这个字符串值的长度小于等于32字节,那么字符串对象将使用embstr编码的方式来保存这个字符串值。embstr同样使用sds实现,和raw的区别是

  • embstr是一种专门用于保存短字符串的优化编码方法,embstr分配的内存空间是连续的。
  • embstr创建字符串的内存分配次数由raw的两次降为一次,释放时也只需要调用一次内存释放函数.
  • embstr比raw能更好的利用连续内存作缓存.

String-embstr

编码转换注意事项

  • long/double类型的数据是作为字符串来存储的,只有在使用的时候才会换回浮点数计算
  • embstr编码对象做任何修改都会先换回raw类型

3. 哈希对象使用场景与底层实现

哈希对象的底层实现有ziplist和hashtable,键值对长度小数量少的时候用ziplist,

##

未完待续……