string
string的底层实现可以是int、raw、embstr。int 编码是用来保存整数值,raw编码是用来保存长字符串,而embstr是用来保存短字符串。
- int,存储 8 个字节的长整型(long,2^63-1)。
- raw,存储大于 44 个字节的字符串(3.2 版本之前是 39 字节)
- embstr, 代表 embstr 格式的 SDS(Simple Dynamic String 简单动态字符串),存储小于 44 个字节的字符串。
当 int 编码保存的值不再是整数,或大小超过了long的范围时,自动转化为raw。对于 embstr 编码,由于 Redis 没有对其编写任何的修改程序(embstr 是只读的),在对embstr对象进行修改时,都会先转化为raw再进行修改,因此,只要是修改embstr对象,修改后的对象一定是raw的,无论是否达到了44个字节。
List
list底层的数据结构可以是 ziplist(压缩列表) 和 linkedlist(双端链表)
当同时满足下面两个条件时,使用ziplist(压缩列表):
- 列表对象保存的所有字符串元素的长度都小于64字节
- 列表保存的元素少于512个
不能满足这两个条件的时候使用 linkedlist(双端链表)
set
set的底层是 intset(整数数组) 或者 hashtable(哈希表)。
当set同时满足以下两个条件时,使用 intset(整数数组):
- 集合对象保存的所有对象都是整数值
- 集合对象保存的元素数量小于512个
不能满足这两个条件的就使用 hashtable(哈希表)
hash
hash的底层是 ziplist(压缩列表) 或者 hashtable(哈希表)
当同时满足下面两个条件时,使用ziplist(压缩列表):
- 哈希对象保存的所有键值对的键和值的字符串长度都小于64字节
- 哈希对象保存的键值对的数量小于512个
不能满足这两个条件的时候使用 hashtable 哈希表)
zset
zset的底层是 ziplist(压缩列表)或者skiplist(跳表)
当zset同时满足以下两个条件时,对象使用 ziplist 编码:
- 有序集合的所有元素长度都小于64字节
- 有序集合的元素数量小于128个
不能满足上面两个条件的使用 skiplist 编码。
总结