本系列教程

  1. 如何在 ubuntu18.04 上安装和保护 redis
  2. 如何连接到 Redis 数据库
  3. 如何管理 Redis 数据库和 Keys
  4. 如何在 Redis 中管理副本和客户端
  5. 如何在 Redis 中管理字符串
  6. 如何在 Redis 中管理 list
  7. 如何在 Redis 中管理 Hashes
  8. 如何在 Redis 中管理 Sets
  9. 如何在 Redis 中管理 Sorted Sets
  10. 如何在 Redis 中运行事务
  11. 如何使 Redis 中的 Key 失效
  12. 如何解决 Redis 中的故障
  13. 如何从命令行更改 Redis 的配置
  14. Redis 数据类型简介

在 Redis 中怎么使用 Sets

Redis 是一个开源的内存中键值数据存储。集合 (Sets) 是存储在 Redis 给定键 (Key) 下的字符串集合。当保存在集合中时,单个记录值称为_成员 (Member)_。与列表 (List) 不同,集合是无序的,并且不允许重复的值。

本教程说明了如何创建集合、检索和删除成员,以及比较不同集合的成员。

如何使用本指南

本指南以备有完整示例的速查表形式编写。我们鼓励您跳至与您要完成的任务相关的任何部分。

本指南中显示的命令已在运行 Redis 版本 4.0.9 的 Ubuntu 18.04 服务器上进行了测试。要设置类似的环境,您可以按照我们的指南 如何在 Ubuntu 18.04 上安装和保护 Redis步骤 1进行操作。我们将通过使用 redis-cli 运行它们来演示这些命令的行为。请注意,如果您使用其他 Redis 界面(例如 Redli),则某些命令的确切输出可能会有所不同。

另外,您可以提供一个托管的 Redis 数据库实例来测试这些命令,但是请注意,根据数据库提供者所允许的控制级别,本指南中的某些命令可能无法按所述方式工作。要配置 DigitalOcean 托管数据库,请遵循我们的 托管数据库产品文档。然后,您必须 安装 Redli 设置 TLS 隧道 才能通过 TLS 连接到托管数据库。

创建集合 (Creating Sets)

sadd 命令允许您创建一个集合并向其中添加一个或多个成员。下面的例子将创建一组在一个名为键 key_horror 与成员 "Frankenstein""Godzilla"

sadd key_horror "Frankenstein" "Godzilla"

如果成功,sadd 将返回一个整数,显示它添加到集合中的成员数量:

Output
(integer) 2

如果您尝试将集合的成员添加到已经持有非集合值的键中,它将返回错误。在此块中的第一个命令创建一个 列表 命名的 key_action 一个元素,"Shaft"。下一条命令尝试将 set 成员添加 "Shane" 到列表中,但是由于数据类型冲突而产生错误:

rpush key_action "Shaft"
sadd key_action "Shane"
Output
(error) WRONGTYPE Operation against a key holding the wrong kind of value

请注意,集合不允许同一成员出现多次:

sadd key_comedy "It's" "A" "Mad" "Mad" "Mad" "Mad" "Mad" "World"
Output
(integer) 4

即使此 sadd 命令指定了八个成员,它也会丢弃四个重复的 "Mad" 成员,从而将大小设置为 4。

从集合中检索成员 (Retrieving Members from Sets)

在本节中,我们将介绍一些 Redis 命令,这些命令返回有关集合中持有的成员的信息。要练习此处概述的命令,请运行以下命令,这将创建一个由六个成员组成的集合,该集合的键为 key_stooges

sadd key_stooges "Moe" "Larry" "Curly" "Shemp" "Joe" "Curly Joe"

要从集合中返回每个成员,请运行 smembers 命令,然后输入要检查的密钥:

smembers key_stooges
Output
1) "Curly"
2) "Moe"
3) "Larry"
4) "Shemp"
5) "Curly Joe"
6) "Joe"

要检查特定值是否是集合的成员,请使用以下 sismember 命令:

sismember key_stooges "Harpo"

如果元素 "Harpo"key_stooges 集合的成员,sismember 则将返回 1。否则,它将返回 0

Output
(integer) 0

要查看给定集合中有多少成员(换句话说,找到给定集合的_基数 (Cardinality)_),请运行 scard

scard key_stooges
Output
(integer) 6

要从集合中返回随机元素,请运行 srandmember

srandmember key_stooges
Output
"Larry"

要从集合中返回多个随机,不同的元素,可以在 srandmember 命令后加上要检索的元素数量:

srandmember key_stooges 3
Output
1) "Larry"
2) "Moe"
3) "Curly Joe"

如果您向传递一个负数 srandmember,则该命令可以多次返回相同的元素:

srandmember key_stooges -3
Output
1) "Shemp"
2) "Curly Joe"
3) "Curly Joe"

srandmember 尽管所使用的随机元素函数的性能在较大的数据集中有所改善,但它并不是完全随机的。有关更多详细信息,请参见 命令的官方文档

从集合中删除成员

Redis 带有用于从一组删除成员三个命令:spopsrem,和 smove

spop 从中随机选择指定数量的成员并返回它们,类似于 srandmember,但是从集合中删除它们。它接受包含集合的键名和要从集合中删除的成员数作为参数。如果您未指定数字,spop 则默认为返回并删除单个值。

以下示例命令将从 key_stooges 上一节创建的集合中删除并返回两个随机选择的元素:

spop key_stooges 2
Output
1) "Shemp"
2) "Larry"

srem 允许您从集合中删除一个或多个特定成员,而不是随机成员:

srem key_stooges "Joe" "Curly Joe"

而不是返回从集合中删除的成员,而是 srem 返回一个整数,显示已删除的成员数:

Output
(integer) 2

使用 smove 一个成员从一组移动到另一个。此命令以该顺序接受源集,目标集和要移动的成员作为参数。请注意,一次 smove 只能移动一位成员:

smove key_stooges key_jambands "Moe"

如果命令成功移动了成员,它将返回 (integer) 1

Output
(integer) 1

如果 smove 失败,它将返回 (integer) 0。请注意,如果目标键尚不存在,请 smove 在将成员移入之前创建它。

比较集合

Redis 还提供了许多命令,可以找到集合之间的差异和相似性。为了演示如何工作的,这部分将引用一个名为三套 presidentskingsbeatles。如果您想亲自尝试本节中的命令,请创建这些集合并使用以下 sadd 命令填充它们:

sadd presidents "George" "John" "Thomas" "James"
sadd kings "Edward" "Henry" "John" "James" "George"
sadd beatles "John" "George" "Paul" "Ringo"

sinter 比较不同的集合并返回_集合相交 (Intersection)_ 或出现在每个集合中的值:

sinter presidents kings beatles
Output
1) "John"
2) "George"

sinterstore 执行类似的功能,但不是返回相交成员,而是在包含这些相交成员的指定目的地创建了一个新集合。请注意,如果目的地已经存在,sinterstore 将覆盖其内容:

sinterstore new_set presidents kings beatles
smembers new_set
Output
1) "John"
2) "George"

sdiff 返回_集合差异 (Difference)_ — 由以下每个集合的第一个指定集合的​​差异得出的成员:

sdiff presidents kings beatles
Output
1) "Thomas"

换句话说,sdiff 查看第一个给定集合中的每个成员,然后将其与每个连续集合中的成员进行比较。第一组中也出现在以下组中的任何成员都将被删除,并 sdiff 返回其余成员。可以将其视为从第一组中删除后续组的成员。

sdiffstore 执行与相似的功能 sdiff,但不返回集合差,而是在给定的目的地创建一个包含集合差的新集合:

sdiffstore new_set beatles kings presidents
smembers new_set
Output
1) "Paul"
2) "Ringo"

像一样 sinterstoresdiffstore 将覆盖目标键(如果已存在)。

sunion 返回_集合并集 (Union)_ 或包含您指定的每个集合的每个成员的集合:

sunion presidents kings beatles
Output
1) "Thomas"
2) "George"
3) "Paul"
4) "Henry"
5) "James"
6) "Edward"
7) "John"
8) "Ringo"

sunion 将结果视为新集,因为它只允许出现任何给定成员。

sunionstore 执行类似的功能,但是在给定的目的地创建一个包含集合并集的新集合,而不仅仅是返回结果:

sunionstore new_set presidents kings beatles
Output
(integer) 8

sinterstore 和一样 sdiffstoresunionstore 如果目标键已经存在,它将覆盖目标键。

结论

本指南详细介绍了用于在 Redis 中创建和管理集的许多命令。如果您想在本指南中概述其他相关的命令,参数或过程,请在下面的评论中提出疑问或提出建议。

有关 Redis 命令的更多信息,请参阅关于 如何管理 Redis 数据库的 系列教程。

说明

本教程基于 Redis 4.0.9 版本编写,部分命令行为在新版本中可能保持一致,但建议参考官方最新文档以获取更新特性。