redis数据结构和底层实现
参考书籍:《redis设计与实现》
1. redis基本数据结构
- String,字符串
- Hash,字典
- List,列表
- Set,集合
- 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.

3. embstr编码
如果一个字符串对象保存的是字符串值,且这个字符串值的长度小于等于32字节,那么字符串对象将使用embstr编码的方式来保存这个字符串值。embstr同样使用sds实现,和raw的区别是
- embstr是一种专门用于保存短字符串的优化编码方法,embstr分配的内存空间是连续的。
- embstr创建字符串的内存分配次数由raw的两次降为一次,释放时也只需要调用一次内存释放函数.
- embstr比raw能更好的利用连续内存作缓存.

编码转换注意事项
- long/double类型的数据是作为字符串来存储的,只有在使用的时候才会换回浮点数计算
- embstr编码对象做任何修改都会先换回raw类型
3. 哈希对象使用场景与底层实现
哈希对象的底层实现有ziplist和hashtable,键值对长度小数量少的时候用ziplist,
##
未完待续……