介绍
Redis是一个开源的内存密钥值数据存储库。 Sets在Redis中是存储在给定密钥上的字符串的集合。
本教程解释了如何创建集,获取和删除成员,并比较不同集的成员。
如何使用此指南
这个指南是写成一个骗局的表,包含自含的示例,我们鼓励你跳到任何与你试图完成的任务相关的部分。
在本指南中显示的命令在运行 Redis 版本 6.0.1 版本的 Ubuntu 22.04 服务器上进行了测试。 要设置类似的环境,您可以遵循我们指南中的 Step 1 在 How To Install and Secure Redis on Ubuntu 22.04 上进行测试。 我们将通过使用 Redis 命令行接口的 redis-cli
来演示这些命令的行为。 如果您使用不同的 Redis 接口 - 例如 - 某些命令的准确输出可能会有所不同。
或者,您可以提供一个管理的 Redis 数据库实例来测试这些命令,但请注意,根据数据库提供商允许的控制级别,本指南中的一些命令可能无法按所述方式工作。 要提供 DigitalOcean 管理数据库,请遵循我们的 管理数据库产品文档。
创建套件
sadd
命令允许您创建一个集合并添加一个或多个成员,下面的示例将以名为key_horror
的键创建一个集合,其成员为Frankenstein
和Godzilla
:
1sadd key_horror "Frankenstein" "Godzilla"
如果成功,‘sadd’将返回一个整数,显示该组增加了多少成员:
1[secondary_label Output]
2(integer) 2
如果您尝试将集合的成员添加到已持有非设置值的密钥中,则会返回错误. 该块中的第一个命令会创建一个名为 key_action
的 列表 和一个元素, `"Shaft" :
1rpush key_action "Shaft"
下一个命令会尝试将设置成员Shane
添加到列表中,但由于数据类型相碰撞,会产生错误:
1sadd key_action "Shane"
1[secondary_label Output]
2(error) WRONGTYPE Operation against a key holding the wrong kind of value
请注意,集不允许同一成员的多个发生:
1sadd key_comedy "It's" "A" "Mad" "Mad" "Mad" "Mad" "Mad" "World"
1[secondary_label Output]
2(integer) 4
虽然这个sadd
命令指定了八个成员,但它丢弃了四个重复的Mad
成员,结果为四个设置大小。
将成员从集合中恢复
在本节中,我们将审查一系列的Redis命令,这些命令会返回有关集中的成员的信息。 要练习描述的命令,请运行下面的命令,该命令将创建一个集合,其中有六个成员,以一个名为key_stooges
的键:
1sadd key_stooges "Moe" "Larry" "Curly" "Shemp" "Joe" "Curly Joe"
若要从集合中返回每个成员,请运行分割
命令,然后是您要检查的密钥:
1smembers key_stooges
1[secondary_label Output]
21) "Curly"
32) "Moe"
43) "Larry"
54) "Shemp"
65) "Curly Joe"
76) "Joe"
若要检查某个特定的值是否是集的一员,请使用sismember
命令:
1sismember key_stooges "Harpo"
如果元素Harpo
是key_stooges
集的一员,则sismember
将返回1
。
1[secondary_label Output]
2(integer) 0
要确认某集中的成员数(换句话说,要找到某集的 cardinality),运行scard
:
1scard key_stooges
1[secondary_label Output]
2(integer) 6
要返回一组随机元素,运行srandmember
:
1srandmember key_stooges
1[secondary_label Output]
2"Larry"
若要从集合中返回多个随机、不同的元素,您可以按照srandmember
命令返回您要获取的元素数量:
1srandmember key_stooges 3
1[secondary_label Output]
21) "Larry"
32) "Moe"
43) "Curly Joe"
如果您将负数传递给srandmember
,该命令将允许返回相同的元素多次:
1srandmember key_stooges -3
1[secondary_label Output]
21) "Shemp"
32) "Curly Joe"
43) "Curly Joe"
在「srandmember」中使用的随机元素函数不是完全随机的,虽然在较大的数据集中其性能会有所改善。
将成员从集合中删除
Redis 配备了用于从集合中删除成员的三个命令:spop
,srem
和smove
。
spop
随机从集合中选择特定数量的成员,并返回它们,类似于srandmember
,然后从集合中删除它们. 它接受包含集合的密钥名称和从集合中删除的成员数量作为参数。
以下示例命令将从上一节创建的 key_stooges
集中删除并返回两个随机选择的元素:
1spop key_stooges 2
1[secondary_label Output]
21) "Shemp"
32) "Larry"
srem
允许您从集合中删除一个或多个特定的成员,而不是随机的成员:
1srem key_stooges "Joe" "Curly Joe"
而不是返回从集合中删除的成员,‘srem’返回一个代表了删除的成员数量的整数:
1[secondary_label Output]
2(integer) 2
使用smove
将会员从一组移动到另一组. 此命令将源组、目标组和会员以此顺序接受为参数。
1smove key_stooges key_jambands "Moe"
如果命令成功地移动成员,它将返回 (integer) 1
:
1[secondary_label Output]
2(integer) 1
如果smove
失败,则会返回(整数) 0
。 请注意,如果目标密钥尚未存在,则smove
会在将成员移动到它之前创建它。
参数比较
Redis 还提供了一些命令,可以找到集之间的差异和相似之处. 为了展示这些集的工作方式,本节将引用名为总统
、国王
和蝙蝠侠
的三个集。
1sadd presidents "George" "John" "Thomas" "James"
2sadd kings "Edward" "Henry" "John" "James" "George"
3sadd beatles "John" "George" "Paul" "Ringo"
sinter
比较不同的集,并返回每个集中出现的 _set 交叉点或值:
1sinter presidents kings beatles
1[secondary_label Output]
21) "John"
32) "George"
sinterstore
执行类似的功能,但而不是返回交叉成员,它会在指定的目的地创建一个新的集合,其中包含这些交叉成员。
1sinterstore new_set presidents kings beatles
2smembers new_set
1[secondary_label Output]
21) "John"
32) "George"
sdiff
返回由第一个指定的集合与下列集合中的每一个集合的差异产生的 set difference 成员:
1sdiff presidents kings beatles
1[secondary_label Output]
21) "Thomas"
sdiff
评估了第一个给定的集中的每个成员,然后将其与每个连续集中的成员进行比较。
sdiffstore
执行类似于sdiff
的函数,但而不是返回设置差异,它在给定的目的地创建了一个新的集,其中包含了设置差异:
1sdiffstore new_set beatles kings presidents
2smembers new_set
1[secondary_label Output]
21) "Paul"
32) "Ringo"
像sinterstore
一样,sdiffstore
将重写目标密钥,如果它已经存在。
sunion
返回_set union_,或包含您指定的每个集中的每个成员的集合:
1sunion presidents kings beatles
1[secondary_label Output]
21) "Thomas"
32) "George"
43) "Paul"
54) "Henry"
65) "James"
76) "Edward"
87) "John"
98) "Ringo"
sunion
将结果视为一个新的集合,因为它只允许任何一个成员发生一次。
’sunionstore’ 执行类似的函数,但创建一个新的集合,该集合在给定目的地中包含组合,而不是返回结果:
1sunionstore new_set presidents kings beatles
1[secondary_label Output]
2(integer) 8
与sinterstore
和sdiffstore
一样,sunionstore
将重写目标密钥,如果它已经存在。
结论
本指南详细介绍了在 Redis 中创建和管理集的若干命令. 如果在本指南中您想要了解的其他相关命令、论点或程序,请在评论中询问或提出建议。
有关 Redis 命令的更多信息,请参阅我们的教程系列 如何管理 Redis 数据库。