dot Redis 8 来了——而且是开源的

了解更多

3.4 哈希

返回主页

3.4 哈希

正如第 1 章介绍的那样,Redis 中的 HASH 允许您将多组键值对存储在一个更高级别的 Redis 键中。 从功能上讲,这些值提供了一些与 STRING 中的值相同的功能,并且对于将相关数据组合在一起很有用。这种数据分组可以被认为类似于关系数据库中的行或文档存储中的文档。

在本节中,我们将讨论最常用的操作 HASH 的命令。 您将了解更多关于向 HASH 添加和删除键值对的操作,以及获取所有 HASH 内容以及递增或递减值的命令。 完成本节后,您将更好地了解将数据存储在 HASH 中的用处以及如何执行此操作。 查看表 3.7 以查看一些常用的 HASH 命令。

表 3.7 用于从 HASH 添加和删除项目的操作
命令 示例用法和描述
HMGET HMGET key-name key [key …] — 获取 HASH 中字段的值
HMSET HMSET key-name key value [key value …] — 设置 HASH 中字段的值
HDEL HDEL key-name key [key …] — 删除 HASH 中的键值对,返回找到并删除的对数
HLEN HLEN key-name — 返回 HASH 中的键值对数

其中一些命令您应该在第 1 章中已经熟悉,但我们有一些新命令可以同时获取和设置多个键。 这些批量命令主要是一种方便,并且可以通过减少客户端和 Redis 之间的调用次数和往返次数来提高 Redis 的性能。 查看下一个清单以查看它们的一些实际应用。

清单 3.7 一个示例交互,展示了 Redis 中一些常见的 HASH 命令
>>> conn.hmset('hash-key', {'k1':'v1', 'k2':'v2', 'k3':'v3'})
True

我们可以通过一次调用将多个项目添加到哈希中。

>>> conn.hmget('hash-key', ['k2', 'k3'])
['v2', 'v3']

我们可以通过一次调用获取值的子集。

>>> conn.hlen('hash-key')
3

HLEN 命令通常用于调试非常大的 HASH。

>>> conn.hdel('hash-key', 'k1', 'k3')
True

HDEL 命令处理多个参数,无需 HMDEL 对应项,如果删除了任何字段,则返回 True。

HMGET/HMSET 命令类似于我们在第 1 章中介绍的单参数版本,唯一的区别在于它们采用列表或字典作为参数,而不是单个条目。

表 3.8 显示了一些其他批量命令和 HASH 上的更多 STRING 类操作。

有了 HGETALLHKEYSHVALUES 似乎没有那么有用,但是当您期望您的值很大时,您可以获取键,然后一个接一个地获取值,以避免阻塞其他请求。

表 3.8 更多批量操作和 HASH 上的 STRING 类调用
命令 示例用法和描述
HEXISTS HEXISTS key-name key — 返回给定的键是否存在于 HASH
HKEYS HKEYS key-name — 获取 HASH 中的键
HVALS HVALS key-name — 获取 HASH 中的值
HGETALL HGETALL key-name — 从 HASH 中获取所有键值对
HINCRBY HINCRBY key-name key increment — 将给定键处存储的值增加整数增量
HINCRBYFLOAT HINCRBYFLOAT key-name key increment — 将给定键处存储的值增加浮点增量

HINCRBYHINCRBYFLOAT 应该会让你想起 STRING 键上可用的 INCRBYINCRBYFLOAT 操作,它们具有相同的语义,应用于 HASH 值。 让我们看看在下一个清单中使用的一些命令。

清单 3.8 一个示例交互,展示了 Redis HASH 的一些更高级功能
>>> conn.hmset('hash-key2', {'short':'hello', 'long':1000*'1'})
True
>>> conn.hkeys('hash-key2')
['long', 'short']

在查看 HASH 时,获取键有助于避免需要传输较大的值。

>>> conn.hexists('hash-key2', 'num')
False

我们还可以检查特定键的存在性。

>>> conn.hincrby('hash-key2', 'num')
1L
>>> conn.hexists('hash-key2', 'num')
True

递增哈希中先前不存在的键的行为与字符串上的行为类似; Redis 的操作就像该值为 0 一样。

正如我们前面描述的那样,当遇到 HASH 中的一个大值时,我们可以获取键,并且只获取我们感兴趣的值,以减少传输的数据量。 我们还可以执行键检查,就像我们可以使用 SISMEMBERSET 执行成员检查一样。 早在第 1 章中,我们就使用了 HINCRBY 来跟踪文章收到的投票数,我们刚刚回顾了这一点。

让我们看一下我们将在剩余章节中经常使用的结构:排序集。