类型与编码:
typedef struct redisObject {
unsigned type:4;//类型
unsigned encoding:4;//编码
void *ptr;//指向底层实现数据结构的指针
} robj;
1.字符串对象
编码: int,整数值,而且这个整数值可以用long类型来表示
raw,字符串值,而且字符串值的长度大于32字节,SDS的内存与redisObject内存不连续
embstr,字符串值,而且字符串值的长度小于32字节,SDS的内存与redisObject内存是连续的
编码转换:当对字符串进行操作时引起字符串类型变化,那么字符串对象的编码也会随即改变,比如在一个10后面加上“days ago”,那么字符串的编码将从int变为raw
2.列表对象
编码: ziplist,需满足以下两个条件1)列表对象保存的所有字符串元素的长度都小于64字节(可修改);2)列表对象保存的元素数量小于512个(可修改)
linkedlist,不满足上述两个条件的列表对象编码都采用linkedlist
笔者实际操作之后发现,不管什么情况,结果都如下:
127.0.0.1:6379> object encoding test
"quicklist"
quicklist:A doubly linked list of ziplists,一个ziplist的双向链表
3.哈希对象
编码: ziplist,先将一个键值对的键推到表尾,然后将这个键值对的值推到表尾,同样需要满足以下两个条件1)哈希对象保存的所有键值对的键和值得字符串长度都小于64(可修改)字节2)哈希对象保存的键值对的数量小于512(可修改)
hashtable,底层采用字典实现
4.集合对象
编码:intset,集合对象使用整数集合作为底层实现,条件1)集合对象保存的所有元素都是整数2)集合对象保存的元素个数不超过512个
hashtable,使用字典作为底层实现,字典的每一个值都是一个字符串对象,每个字符串对象都包含一个集合元素,字典的值全部为null
5.有序集合对象
编码:ziplist,使用压缩列表作为底层实现,要求1)有序集合保存的元素数量小于128,2)有序集合保存的所有元素成员的长度都小于64字节
skiplist,使用zset作为底层实现,一个zset结构同时包含一个字典和一个跳跃表;同时使用字典和跳跃表是为了1)保留字典以O(1)的时间复杂度查找成员的分值这一特性2)保留跳跃表执行范围型操作的优点