如何在Redis中管理Sets
系列教程导航
- 如何在 ubuntu18.04 上安装和保护 redis
- 如何连接到 Redis 数据库
- 如何管理 Redis 数据库和 Keys
- 如何在 Redis 中管理副本和客户端
- 如何在 Redis 中管理字符串
- 如何在 Redis 中管理 list
- 如何在 Redis 中管理 Hashes
- 如何在 Redis 中管理 Sets
- 如何在 Redis 中管理 Sorted Sets
- 如何在 Redis 中运行事务
- 如何使 Redis 中的 Key 失效
- 如何解决 Redis 中的故障
- 如何从命令行更改 Redis 的配置
- Redis 数据类型简介
介绍
Redis 是一个开源的内存中键值数据存储。集合 (Sets) 是存储在给定键 (Key) 下的字符串集合。当保存在集合中时,单个记录值称为_成员 (Member)_。与列表 (List) 不同,集合是无序的,并且不允许重复的值。
本教程说明了如何创建集合、检索和删除成员,以及比较不同集合的成员。
如何使用本指南
本指南以备有完整示例的备忘单形式编写。我们鼓励您跳至与您要完成的任务相关的任何部分。
本指南中显示的命令已在运行 Redis 版本 4.0.9 的 Ubuntu 18.04 服务器上进行了测试。要设置类似的环境,您可以按照我们的指南 如何在 Ubuntu 18.04 上安装和保护 Redis 的 步骤 1 进行操作。我们将通过使用 Redis 命令行界面 (redis-cli) 运行它们来演示这些命令的行为。请注意,如果您使用其他 Redis 界面(例如 Redli),则某些命令的确切输出可能会有所不同。
另外,您可以提供一个托管的 Redis 数据库实例来测试这些命令,但是请注意,根据数据库提供者所允许的控制级别,本指南中的某些命令可能无法按所述方式工作。要配置 DigitalOcean 托管数据库,请遵循我们的 托管数据库产品文档。然后,您必须 安装 Redli 或 设置 TLS 隧道 才能通过 TLS 连接到托管数据库。
创建集合 (Sets)
sadd 命令允许您创建一个集合并向其中添加一个或多个成员。下面的例子将创建一个名为 key_horror 的键,并包含成员 "Frankenstein" 和 "Godzilla":
sadd key_horror "Frankenstein" "Godzilla"如果成功,sadd 将返回一个整数,显示它添加到集合中的成员数量:
(integer) 2如果您尝试将集合的成员添加到已经持有非集合值的键中,它将返回错误。在此块中的第一个命令创建一个 列表 命名的 key_action 一个元素 "Shaft"。下一条命令尝试将集合成员 "Shane" 添加到列表中,但是由于数据类型冲突而产生错误:
rpush key_action "Shaft"
sadd key_action "Shane"(error) WRONGTYPE Operation against a key holding the wrong kind of value请注意,集合不允许同一成员出现多次:
sadd key_comedy "It's" "A" "Mad" "Mad" "Mad" "Mad" "Mad" "World"(integer) 4即使此 sadd 命令指定了八个成员,它也会丢弃四个重复的 "Mad" 成员,从而将大小设置为 4。
检索集合成员
在本节中,我们将介绍一些 Redis 命令,这些命令返回有关集合中持有的成员的信息。要练习此处概述的命令,请运行以下命令,这将创建一个由六个成员组成的集合,该集合的键为 key_stooges:
sadd key_stooges "Moe" "Larry" "Curly" "Shemp" "Joe" "Curly Joe"要从集合中返回每个成员,请运行 smembers 命令,然后输入要检查的键:
smembers key_stooges1) "Curly"
2) "Moe"
3) "Larry"
4) "Shemp"
5) "Curly Joe"
6) "Joe"要检查特定值是否是集合的成员,请使用 sismember 命令:
sismember key_stooges "Harpo"如果元素 "Harpo" 是 key_stooges 集合的成员,sismember 则将返回 1。否则,它将返回 0:
(integer) 0要查看给定集合中有多少成员(换句话说,找到给定集合的_基数 (Cardinality)_),请运行 scard:
scard key_stooges(integer) 6要从集合中返回随机元素,请运行 srandmember:
srandmember key_stooges"Larry"要从集合中返回多个随机、不同的元素,可以在 srandmember 命令后加上要检索的元素数量:
srandmember key_stooges 31) "Larry"
2) "Moe"
3) "Curly Joe"如果您向 srandmember 传递一个负数,则该命令可以多次返回相同的元素:
srandmember key_stooges -31) "Shemp"
2) "Curly Joe"
3) "Curly Joe"srandmember 尽管所使用的随机元素函数的性能在较大的数据集中有所改善,但它并不是完全随机的。有关更多详细信息,请参见 命令的官方文档。
删除集合成员
Redis 带有用于从集合删除成员三个命令:spop,srem,和 smove。
spop 从中随机选择指定数量的成员并返回它们,类似于 srandmember,但是从集合中删除它们。它接受包含集合的键名和要从集合中删除的成员数作为参数。如果您未指定数字,spop 则默认为返回并删除单个值。
以下示例命令将从 key_stooges 上一节创建的集合中删除并返回两个随机选择的元素:
spop key_stooges 21) "Shemp"
2) "Larry"srem 允许您从集合中删除一个或多个特定成员,而不是随机成员:
srem key_stooges "Joe" "Curly Joe"而不是返回从集合中删除的成员,srem 返回一个整数,显示已删除的成员数:
(integer) 2使用 smove 一个成员从一个集合移动到另一个。此命令以该顺序接受源集合、目标集合和要移动的成员作为参数。请注意,一次 smove 只能移动一位成员:
smove key_stooges key_jambands "Moe"如果命令成功移动了成员,它将返回 (integer) 1:
(integer) 1如果 smove 失败,它将返回 (integer) 0。请注意,如果目标键尚不存在,smove 在将成员移入之前会创建它。
比较集合
Redis 还提供了许多命令,可以找到集合之间的差异和相似性。为了演示如何工作的,这部分将引用三个名为 presidents,kings 和 beatles 的集合。如果您想亲自尝试本节中的命令,请创建这些集合并使用以下 sadd 命令填充它们:
sadd presidents "George" "John" "Thomas" "James"
sadd kings "Edward" "Henry" "John" "James" "George"
sadd beatles "John" "George" "Paul" "Ringo"sinter 比较不同的集合并返回_集合相交_或出现在每个集合中的值:
sinter presidents kings beatles1) "John"
2) "George"sinterstore 执行类似的功能,但不是返回相交成员,而是在包含这些相交成员的指定目的地创建了一个新集合。请注意,如果目的地已经存在,sinterstore 将覆盖其内容:
sinterstore new_set presidents kings beatles
smembers new_set1) "John"
2) "George"sdiff 返回_集合差异_ — 由以下每个集合的第一个指定集合的差异得出的成员:
sdiff presidents kings beatles1) "Thomas"换句话说,sdiff 查看第一个给定集合中的每个成员,然后将其与每个连续集合中的成员进行比较。第一组中也出现在以下组中的任何成员都将被删除,sdiff 返回其余成员。可以将其视为从第一组中删除后续组的成员。
sdiffstore 执行与相似的功能 sdiff,但不返回集合差,而是在给定的目的地创建一个包含集合差的新集合:
sdiffstore new_set beatles kings presidents
smembers new_set1) "Paul"
2) "Ringo"像 sinterstore 一样,sdiffstore 将覆盖目标键(如果已存在)。
sunion 返回_集合并集_或包含您指定的每个集合的每个成员的集合:
sunion presidents kings beatles1) "Thomas"
2) "George"
3) "Paul"
4) "Henry"
5) "James"
6) "Edward"
7) "John"
8) "Ringo"sunion 将结果视为新集,因为它只允许出现任何给定成员。
sunionstore 执行类似的功能,但是在给定的目的地创建一个包含集合并集的新集合,而不仅仅是返回结果:
sunionstore new_set presidents kings beatles(integer) 8与 sinterstore 和 sdiffstore 一样,sunionstore 如果目标键已经存在,它将覆盖目标键。
结论
本指南详细介绍了用于在 Redis 中创建和管理集合的许多命令。如果您想在本指南中概述其他相关的命令、参数或过程,请在下面的评论中提出疑问或提出建议。
有关 Redis 命令的更多信息,请参阅关于 如何管理 Redis 数据库的 系列教程。
作者:分布式编程
出处:https://blog.jsdiff.com/
如果你喜欢本文,请长按二维码,关注 分布式编程

说明:本文命令基于 Redis 4.0.9 版本测试,适用于大多数现代 Redis 版本。基本集合命令在不同版本间保持稳定,但具体输出格式或高级特性可能随版本更新有所变化。
版权声明:本文为原创文章,版权归 戴老师的博客 所有,转载请联系博主获得授权。
本文地址:https://1diff.fun/archives/ru-he-zai-redis-zhong-guan-li-sets.html
如果对本文有什么问题或疑问都可以在评论区留言,我看到后会尽量解答。