这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战
一、列表对象
1、列表对象简介
列表对象的编码可以是ziplist或者linkedlist。 ziplsit编码的列表对象使用压缩列表作为底层实现,每个压缩列表节点(entry)保存了一个列表元素。
ziplist编码的列表对象
linkedlist编码的列表对象使用双端链表作为底层实现,每个双端链表节点(node)都保存了一个字符串对象,而每个字符串对象都保存了一个列表元素。
linkedlist编码的列表对象
2、列表对象编码转换
当列表对象可以同时满足以下两个条件时,列表对象使用ziplist编码:
- 列表对象保存的所有字符串元素的长度都小于64字节;
- 列表对象保存的元素数量小于512个;不能满足这两个条件的列表对象需要使用linkedlist编码。 但以上两个条件的上限值是可以修改的,具体请看配置文件中关于list-max-ziplist-value选项和list-max-ziplist-entries选项的说明。
以下示例显示列表对象编码转换的一个过程:
# 所有元素的长度都小于64字节
redis> RPUSH blah "hello" "world" "again"
(integer)3
redis> OBJECT ENCODING blah
"ziplist"
# 将一个65字节长的元素推入列表对象中
redis> RPUSH blah "wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww"
(integer)4
# 编码已改变
redis> OBJECT ENCODE blah
"linkedlist"
二、哈希对象
1、哈希对象简介
哈希对象的编码可以是ziplist或者hashtable。 ziplist编码的哈希对象使用压缩列表作为底层实现,每当有新键值对要加入到哈希对象时,程序会先将保存了键的压缩列表节点推入到压缩列表表尾,然后再将保存了值的压缩列表节点推入到压缩列表表尾。
ziplist编码的哈希对象
哈希对象的压缩列表底层实现
hashtable编码的哈希对象使用字典作为底层实现,哈希对象中的每个键值对都使用一个字典键值对来保存:
1、字典中的每个键都是一个字符串对象,对象中保存了键值对的键;
2、字典中的每个值都是一个字符串对象,对象中保存了键值对的值;
hashtable编码的哈希对象
2、哈希对象编码转换
当哈希对象可以同时满足以下两个条件时,哈希对象使用ziplist编码:
- 哈希对象保存的所有键值对的键和值的字符串长度都小于64字节;
- 哈希对象保存的键值对数量小于512个;不能满足这两个条件的哈希对象需要使用hashtables编码。 但以上两个条件的上限值是可以修改的,具体请看配置文件中关于hash-max-ziplist-value选项和hash-max-ziplist-entries选项的说明。