跟我一起来学习Redis中的列表对象与哈希对象

259 阅读3分钟

这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战

一、列表对象

1、列表对象简介

  列表对象的编码可以是ziplist或者linkedlist。   ziplsit编码的列表对象使用压缩列表作为底层实现,每个压缩列表节点(entry)保存了一个列表元素。

image.png

ziplist编码的列表对象

  linkedlist编码的列表对象使用双端链表作为底层实现,每个双端链表节点(node)都保存了一个字符串对象,而每个字符串对象都保存了一个列表元素。

image.png

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编码的哈希对象使用压缩列表作为底层实现,每当有新键值对要加入到哈希对象时,程序会先将保存了键的压缩列表节点推入到压缩列表表尾,然后再将保存了值的压缩列表节点推入到压缩列表表尾。

image.png

ziplist编码的哈希对象

image.png

哈希对象的压缩列表底层实现

  hashtable编码的哈希对象使用字典作为底层实现,哈希对象中的每个键值对都使用一个字典键值对来保存:
1、字典中的每个键都是一个字符串对象,对象中保存了键值对的键;
2、字典中的每个值都是一个字符串对象,对象中保存了键值对的值;

image.png

hashtable编码的哈希对象

2、哈希对象编码转换

  当哈希对象可以同时满足以下两个条件时,哈希对象使用ziplist编码:

  • 哈希对象保存的所有键值对的键和值的字符串长度都小于64字节;
  • 哈希对象保存的键值对数量小于512个;不能满足这两个条件的哈希对象需要使用hashtables编码。   但以上两个条件的上限值是可以修改的,具体请看配置文件中关于hash-max-ziplist-value选项和hash-max-ziplist-entries选项的说明。