因为 embstr 编码的字符串对象的所有数据都保存在一块连续的内存里面,所以这种编码的字符串对象比起 raw ,编码的字符串对象能够更好地利用缓存带来的优势。
哈希对象(hash)哈希对象的编码有两种,分别是:ziplist、hashtable。
当哈希对象保存的键值对数量小于 512,并且所有键值对的长度都小于 64 字节时,使用压缩列表存储;否则使用 hashtable 存储。
哈希对象的压缩列表对应的示意图如下(出自《Redis设计与实现第二版》第八章:对象):
哈希对象的 hashtable 对应的示意图如下(出自《Redis设计与实现第二版》第八章:对象):
列表对象(list)列表对象的编码有两种,分别是:ziplist、linkedlist。
ziplist(压缩列表)主要是为节省内存而设计的内存结构,它的优点就是节省内存,但缺点就是比其他结构要消耗更多的时间,所以 Redis 在数据量小的时候使用压缩列表存储。
当列表的长度小于 512,并且所有元素的长度都小于 64 字节时,使用压缩列表存储;否则使用 linkedlist 存储。
列表对象的压缩列表对应的示意图如下出自《Redis设计与实现第二版》第八章:对象):
列表对象的链表对应的示意图如下出自《Redis设计与实现第二版》第八章:对象):
集合对象(set)集合对象的编码有两种,分别是:intset、hashtable。
intset(整数集合)主要是为节省内存而设计的内存结构,它的优点就是节省内存,但缺点就是比其他结构要消耗更多的时间,所以 Redis 在数据量小的时候使用整数集合存储。
当集合的长度小于 512,并且所有元素都是整数时,使用整数集合存储;否则使用 hashtable 存储。
集合对象的 intset 对应的示意图如下出自《Redis设计与实现第二版》第八章:对象):
集合对象的 hashtable 对应的示意图如下出自《Redis设计与实现第二版》第八章:对象):
有序集合对象(sort set)有序集合对象的编码有两种,分别是:ziplist、skiplist。
当有序集合的长度小于 128,并且所有元素的长度都小于 64 字节时,使用压缩列表存储;否则使用 skiplist 存储。
有序集合对象的 ziplist 对应的示意图如下出自《Redis设计与实现第二版》第八章:对象):
有序集合对象的 skiplist 对应的示意图如下出自《Redis设计与实现第二版》第八章:对象):