redis基本类型之哈希对象

108 阅读2分钟

这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

14redis基本类型之哈希对象

哈希对象编码可以是ziplist或hashtable

哈希对象保证的所有键值对的键和值的字符串长度小于64字节,保存键值对数量小于512个,使用ziplist编码,否则使用hashtable编码

ziplist

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

保存了同一键值对的两个节点总是紧挨在一起,保存键的节点在前,保存值的节点在后,先添加到哈希对象中的键值对在压缩列表的表头方向,后添加到哈希对象中的键值对在压缩列表的表尾方向。

hashtable

哈希对象中的每个键值对都使用一个字典键值对来保存:

  • 字典的每个键都是一个字符串对象,对象中保存了键值对的键
  • 字典的每个值都是一个字符串对象,对象中保存了键值对的值

常用命令

HSET

将哈希表 hash 中域 field 的值设置为 value

redis> HSET website google "www.g.cn"
(integer) 1

redis> HGET website google
"www.g.cn"

HSET 命令在哈希表中新创建 field 域并成功为它设置值时, 命令返回 1 ; 如果域 field 已经存在于哈希表, 并且 HSET 命令成功使用新值覆盖了它的旧值, 那么命令返回 0

HGET

返回哈希表中给定域的值,如果给定域不存在于哈希表中, 又或者给定的哈希表并不存在, 那么命令返回 nil

HEXISTS

HEXISTS 命令在给定域存在时返回 1 , 在给定域不存在时返回 0

HDEL

删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。

试数据

redis> HGETALL abbr
1) "a"
2) "apple"
3) "b"
4) "banana"
5) "c"
6) "cat"
7) "d"
8) "dog"


# 删除单个域

redis> HDEL abbr a
(integer) 1


# 删除不存在的域

redis> HDEL abbr not-exists-field
(integer) 0


# 删除多个域

redis> HDEL abbr b c
(integer) 2

redis> HGETALL abbr
1) "d"
2) "dog"