合肥建设信息网站,汕头免费模板建站,太原网站专业制作,html5 微网站布局简介
从数据类型上体现就是#xff0c;同一个数据类型#xff0c;在不同的情况下会使用不同的编码类型#xff0c;底层所使用的的数据结构也不相同。 字符串对象
字符串对象的编码可以是 int、raw 和 embstr 三者之一。
embstr 编码是专门用于保存简短字符串的一种优化编…简介
从数据类型上体现就是同一个数据类型在不同的情况下会使用不同的编码类型底层所使用的的数据结构也不相同。 字符串对象
字符串对象的编码可以是 int、raw 和 embstr 三者之一。
embstr 编码是专门用于保存简短字符串的一种优化编码方式与 raw 编码会调用两次内存分配函数分别创建 redisObject 结构和 sdshdr 结构不同embstr 只会使用一次内存分配函数创建一块连续的内存空间同时存放 redisObject 结构和 sdshdr 结构。
字符串转换编码的条件如下
如果字符串对象存储的是整数值并且不超过 long 的范围时优先选择使用 int 作为编码方式如果存储的字符串长度大于 32 个字节会使用 raw 编码的简单动态字符串作为保存如果存储的字符串长度小于 32 个字节会使用 embstr 编码的简单动态字符串作为保存
字符串对象中有两个需要注意的地方
对于存储浮点数的字符串对象实际上这个浮点数是以字符串值来保存的执行如 INCRBYFLOAT 这样的命令时Redis 会先将字符串转换成浮点数计算然后再转换成字符串值存储int 编码和 embstr 编码在条件满足下会转换成 raw 编码。embstr 在执行修改命令之后总是会转换成 raw 编码这个过程是不可逆的
列表对象
在 3.2 版本之前列表对象的编码可以是 ziplist 或者 zlinkedlist 的其中一个在 3.2 版本之后列表对象的编码只能是 quicklist。
哈希对象
哈希对象的编码可以是 ziplist 或者 hashtable 中的一个。
哈希对象使用 ziplist 作为底层实现的时候每当有新的键值对要插入哈希对象时Redis 会先保存键的压缩列表节点到压缩列表的表尾然后再保存值的压缩列表节点到压缩列表的表尾。
当哈希对象同时满足以下两个条件时哈希对象使用 ziplist 编码
哈希对象保存的所有键值对的键和值的字符串长度都小于 64 字节哈希对象保存的键值对数量小于 512 个
集合对象
集合对象的编码可以是 intset 或者 hashtable 中的一个。
hashtable 编码的集合对象使用字典作为底层实现字典的每个键都是字符串对象这个字符串对象包含着集合元素字典的每个值都直接存储 NULL。
当集合对象同时满足以下两个条件时集合对象使用 intset 编码
集合对象保存的所有元素都是整数值集合对象保存的元素数据不超过 512 个
有序集合对象
有序集合对象的编码可以是 ziplist 或者 skiplist 中的一个。
有序集合对象使用 ziplist 编码作为底层实现时每个集合对象会使用两个紧挨在一起的压缩列表节点来保存第一个节点保存元素的成员第二个元素则保存元素的分值。
这里有一点需要注意skiplist 编码的有序集合使用 zset 结构作为底层实现一个 zset 结构包含一个字典和一个跳表。其中字典的键保存元素的成员字典的值保存元素的分值跳表的 object 属性保存元素的成员跳表的 score 属性保存元素的分值。
理论上有序集合可以只使用字典或者跳表实现但是使用两个结构冗余存储有序集合对象的成员和分值既保留了字典 O(1) 时间复杂度查找的效率也保留了跳表范围型操作的所有优点。
当同时满足以下两个条件时有序集合会使用 ziplist 编码
有序集合保存的元素数量小于 128 个 有序集合保存的所有元素成员的长度都小于 64 字节