字符串对象的 encoding 有三种,分别是:int、raw、embstr。
如果一个字符串对象保存的是整数值,并且这个整数值可以用 long 类型标识,那么字符串对象会讲整数值保存在 ptr 属性中,并将 encoding 设置为 int。
假设有如下命令:set number 10086。那么 number 键对象的示意图如下(出自《Redis设计与实现第二版》第八章:对象):
如果字符串对象保存的是一个字符串值,并且这个字符串的长度大于 32 字节,那么字符串对象将使用一个简单动态字符串(SDS)来保存这个字符串值,并将对象的编码设置为 raw。
使用 raw 存储字符串的示意图如下(出自《Redis设计与实现第二版》第八章:对象):
如果字符串对象保存的是一个字符串值,并且这个字符串的长度小于等于 32 字节,那么字符串对象将使用 embstr 编码的方式来保存这个字符串。
使用 embstr 存储字符串的示意图如下(出自《Redis设计与实现第二版》第八章:对象):
既然有了 raw 的编码方式,为什么还会有 embstr 的编码方式呢?
因为 embstr 的编码方式有一些优点,如下:
哈希对象的编码有两种,分别是:ziplist、hashtable。
当哈希对象保存的键值对数量小于 512,并且所有键值对的长度都小于 64 字节时,使用压缩列表存储;否则使用 hashtable 存储。
哈希对象的压缩列表对应的示意图如下(出自《Redis设计与实现第二版》第八章:对象):
哈希对象的 hashtable 对应的示意图如下(出自《Redis设计与实现第二版》第八章:对象):
列表对象的编码有两种,分别是:ziplist、linkedlist。
ziplist(压缩列表)主要是为节省内存而设计的内存结构,它的优点就是节省内存,但缺点就是比其他结构要消耗更多的时间,所以 Redis 在数据量小的时候使用压缩列表存储。
当列表的长度小于 512,并且所有元素的长度都小于 64 字节时,使用压缩列表存储;否则使用 linkedlist 存储。
列表对象的压缩列表对应的示意图如下出自《Redis设计与实现第二版》第八章:对象):
列表对象的链表对应的示意图如下出自《Redis设计与实现第二版》第八章:对象):
集合对象的编码有两种,分别是:intset、hashtable。
intset(整数集合)主要是为节省内存而设计的内存结构,它的优点就是节省内存,但缺点就是比其他结构要消耗更多的时间,所以 Redis 在数据量小的时候使用整数集合存储。
当集合的长度小于 512,并且所有元素都是整数时,使用整数集合存储;否则使用 hashtable 存储。
集合对象的 intset 对应的示意图如下出自《Redis设计与实现第二版》第八章:对象):
集合对象的 hashtable 对应的示意图如下出自《Redis设计与实现第二版》第八章:对象):
有序集合对象的编码有两种,分别是:ziplist、skiplist。
当有序集合的长度小于 128,并且所有元素的长度都小于 64 字节时,使用压缩列表存储;否则使用 skiplist 存储。
有序集合对象的 ziplist 对应的示意图如下出自《Redis设计与实现第二版》第八章:对象):
有序集合对象的 skiplist 对应的示意图如下出自《Redis设计与实现第二版》第八章:对象):
转自:https://www.cnblogs.com/wind-snow/p/11172832.html
原文:https://www.cnblogs.com/ttaylor/p/14082776.html