如何管理 Redis 中的哈希散列(Hash)

源地址:https://www.digitalocean.com/community/tutorials/how-to-manage-hashes-in-redis
作者:Mark Drake

简介

Redis 是一个开源的、运行在内存中的键值数据库。Redis 的 哈希散列 是一种数据类型,它表示一个字符串字段和一个字符串值之间的映射。一个哈希可以容纳许多键值对,并且被设计成不占用太多空间,使其成为代表数据对象的理想选择。例如,一个哈希值可能代表一个客户,并包括 "姓名"、"地址"、"电子邮件 "或 "客户 ID "等字段。

本教程将介绍如何在 Redis 中管理哈希,包括创建哈希、检索和删除哈希散列中的数据。

如何使用这个教程

这个教程是以小抄(Cheat Sheet)的形式写的,有对应的例子。我们鼓励你直接跳转到和你要完成的任务相关的章节进行阅读。

这个教程中的命令在 Ubuntu 18.04 中的 Redis 4.0.9 版本完成测试。如果你需要建设一个同样的环境,可以参考我们的 如何在 Ubuntu 18.04 上安装并加固 Redis 中的 Step 1 来安装 Redis。我们将通过 Redis 命令行界面redis-cli运行这些命令,来演示这些命令的行为。请注意,如果你使用不同的 Redis 工具--例如Redli —— 某些命令的实际输出可能有所不同。

此外,你还可以使用一个代管的 Redis 数据库实例来测试这些命令。但需要注意的是,根据你的数据库服务提供商的限制,这个教程中的某些命令可能运行效果和教程不一致。如果想要使用 DigitalOcean 提供的代管数据库,可以查看我们的代管数据库产品文档。使用代管 Redis 数据库实例时,你必须安装 Redli设置 TLS 隧道 来通过 TLS 链接到代管数据库。

创建哈希散列

要创建哈希散列,请运行 hset 命令。此命令接受哈希键的名称、字段字符串和相应的值字符串作为参数:

127.0.0.1:6379>  hset poet:Verlaine nationality French

注意:在这个例子中,poet:Verlaine 是这个散列的键。点、破折号、冒号通常用于使多字的键和字段更具有可读性。确保你的键遵循同一个易于阅读的规范对于数据维护很有帮助。

如果指定的字段是新字段并且值设置正确,则 hset 返回 (integer) 1

输出

 (integer) 1

但是,如果你没有为哈希键包含值、字段或名称,“hset”将返回错误。

另外,请注意 hset 将覆盖已经存在的散列的内容。

127.0.0.1:6379>  hset poet:Verlaine nationality Francais

如果该字段已存在并且其值已成功更新,则 hset 将返回 (integer) 0

输出

 (integer) 0

你还可以使用 hsetnx 将字段添加到哈希散列中,但它仅在该字段尚不存在时才有效。如果指定的字段已经存在,hsetnx 不会有任何作用,并且会返回 (integer) 0

127.0.0.1:6379>  hsetnx poet:Verlaine nationality French

输出

 (integer) 0

要将多个字段/值对设置为给定集合,请使用 hmset 命令,后跟相应的字段/值字符串:

127.0.0.1:6379>  hmset poet:Verlaine born 1844 died 1896 genre Decadent

hmset 成功后将会返回一个 OK

从哈希散列中提取值

你可以使用 hexists 命令确定给定哈希散列是否存在字段:

127.0.0.1:6379>  hexists poet:Verlaine nationality

如果字段存在,hexists 将返回 (integer) 1,如果不存在,则返回 (integer) 0

要返回字段的值,请运行 hget 命令,后跟哈希键和要检索其值的字段:

127.0.0.1:6379>  hget poet:Verlaine nationality

输出

 "Francais"

hmget 使用相同的语法,但可以返回多个字段的值

127.0.0.1:6379>  hmget poet:Verlaine born died

输出

 1) "1844"
 2) "1896"

如果你传递给 hgethmget 的哈希值不存在,这两个命令都将返回 (nil)

127.0.0.1:6379>  hmget poet:Dickinson born died

输出

 1) (nil)
 2) (nil)

要获取某个哈希散列中包含的所有字段的列表,请运行“hkeys”命令:

127.0.0.1:6379>  hkeys poet:Verlaine

输出

 1) "nationality"
 2) "born"
 3) "died"
 4) "genre"

相反,运行 hvals 来检索保存在哈希散列中的值列表:

127.0.0.1:6379>  hvals poet:Verlaine

输出

 1) "French"
 2) "1844"
 3) "1896"
 4) "Decadent"

要返回散列所包含的每个字段及其关联值的列表,请运行 hgetall

127.0.0.1:6379>  hgetall poet:Verlaine

输出

 1) "nationality"
 2) "French"
 3) "born"
 4) "1844"
 5) "died"
 6) "1896"
 7) "genre"
 8) "Decadent"

你可以通过运行 hlen 来查找哈希散列中的字段数,它代表“hash length”:

127.0.0.1:6379>  hlen poet:Verlaine

输出

 (integer) 4

你可以使用hstrlen找到与字段关联的值字符串的长度,它代表“hash string length”:

127.0.0.1:6379>  hstrlen poet:Verlaine nationality

输出

 (integer) 8

如果哈希散列不存在,hlen 将返回 (integer) 0

从哈希散列中移除字段

要从哈希散列中删除字段,请运行“hdel”命令。 hdel 可以接受多个字段作为参数,并将返回一个整数,指示从哈希散列中删除了多少字段:

127.0.0.1:6379>  hdel poet:Verlaine born died

输出

 (integer) 2

如果你将不存在的字段传递给 hdel,它将忽略该字段但删除你指定的任何其他现有字段。

总结

本指南详细介绍了一些用于在 Redis 中创建和管理哈希的命令。