Redis集合管理:高效存储与操作指南
简介
Redis是一个开源的内存键值数据存储系统。在Redis中,集合是以给定键存储的字符串的无序集合。在集合中,每个记录值被称为成员。与列表不同,集合是无序的,并且不允许重复的值。
本教程将详细解释如何在Redis中创建集合、检索和删除集合成员,以及比较不同集合中的成员。
如何使用本指南
本指南以自包含示例的备忘录形式编写。我们鼓励您直接跳转到与您即将完成的任务相关的部分。
本指南中展示的命令在运行Redis 6.0.16版本的Ubuntu 22.04服务器上进行了测试。要创建类似的环境,您可以按照我们关于如何在Ubuntu 22.04上安装和保护Redis的指南中的第一步进行操作。我们将通过redis-cli
(Redis命令行界面)运行这些命令来演示其行为。如果您使用的是不同的Redis接口,比如Redli,某些命令的确切输出可能会有所不同。
此外,您也可以提供一个托管的Redis数据库实例来测试这些命令,但请注意,根据数据库提供商允许的控制级别,本指南中的某些指令可能无法正常工作。要提供Silicon Cloud托管数据库,请按照我们的托管数据库产品文档进行操作。然后,您必须安装Redli或设置一个TLS隧道以通过TLS连接到托管数据库。
创建集合
使用sadd
命令,您可以创建一个集合并将一个或多个成员添加进去。下面的例子会在一个名为key_horror
的键上创建一个集合,并添加成员“Frankenstein”和“Godzilla”。
- sadd key_horror "Frankenstein" "Godzilla"
如果成功,sadd
将返回一个整数,显示它向集合中添加了多少个成员。
(integer) 2
如果您尝试将一个集合的成员添加到已经持有非集合值的键中,它将返回一个错误。以下代码块中的第一个命令创建了一个名为key_action
的列表,其中包含一个元素“Shaft”。
- rpush key_action "Shaft"
下一个命令尝试将一个集合成员“Shane”添加到列表中,但由于数据类型冲突而导致错误。
- 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”成员,因此最终集合的大小是四。
从集合中获取成员
在本节中,我们将回顾一些返回有关集合成员信息的Redis命令。为了练习所述的命令,请运行以下命令,它将在名为key_stooges
的键上创建一个包含六个成员的集合。
- sadd key_stooges "Moe" "Larry" "Curly" "Shemp" "Joe" "Curly Joe"
要返回集合中的每个成员,运行smembers
命令,然后跟上你想要检查的键。
- smembers key_stooges
1) "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
要确认给定集合中的成员数量(换句话说,找到给定集合的基数),运行scard
。
- scard key_stooges
这是文章《如何在Redis中管理集合》的第2部分(共3部分)。
(integer) 6
要从集合中返回一个随机元素,请运行SRANDMEMBER
命令。
- SRANDMEMBER key_stooges
"Larry"
要从一个集合中返回多个不同的随机元素,你可以使用SRANDMEMBER
命令以及你想要检索的元素数量。
- SRANDMEMBER key_stooges 3
1) "Larry" 2) "Moe" 3) "Curly Joe"
如果你向SRANDMEMBER
传递一个负数,该命令允许返回相同的元素多次。
- SRANDMEMBER key_stooges -3
1) "Shemp" 2) "Curly Joe" 3) "Curly Joe"
SRANDMEMBER
函数中使用的随机元素功能并不完全随机,尽管在较大的数据集中它的性能会有所改善。请阅读该命令的官方文档以获取更多详细信息。
从集合中移除成员
Redis提供了三个命令用于从集合中移除成员:SPOP
、SREM
和SMOVE
。
SPOP
从集合中随机选择指定数量的成员并返回,类似于SRANDMEMBER
,但是会从集合中删除这些成员。它接受包含集合的键名和要从集合中移除的成员数量作为参数。如果没有指定数量,SPOP
会默认返回并移除一个值。
以下示例命令将从上一节创建的key_stooges
集合中随机选择两个元素并将其删除并返回。
- SPOP key_stooges 2
1) "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 beatles
这是文章《如何在Redis中管理集合》的第3部分(共3部分)。
1) "John" 2) "George"
SINTERSTORE
函数的功能类似 SINTER
,但它不是返回交集成员,而是在指定的目标键创建一个包含这些交集成员的新集合。请注意,如果目标键已经存在,SINTERSTORE
函数将会覆盖其内容。
- sinterstore new_set presidents kings beatles
- smembers new_set
1) "John" 2) "George"
SDIFF
返回集合的差异,即从第一个指定的集合中减去每个后续集合的成员。
- sdiff presidents kings beatles
1) "Thomas"
SDIFF
函数会对第一个给定集合中的每个成员进行评估,并将其与后续集合中的成员进行比较。如果第一个集合中的任何成员也出现在后续集合中,它将被移除,然后 SDIFF
函数会返回剩余的成员。可以将其视为从第一个集合中移除后续集合的成员。
SDIFFSTORE
的功能类似于 SDIFF
,但不同之处在于它不返回集合的差异,而是在指定的目的地创建一个包含集合差异的新集合。
- sdiffstore new_set beatles kings presidents
- smembers new_set
1) "Paul" 2) "Ringo"
和 SINTERSTORE
一样,如果目标键已经存在,SDIFFSTORE
将会覆盖它。
SUNION
返回集合的并集,或者是一个包含您指定的所有集合成员的集合。
- sunion presidents kings beatles
1) "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 数据库的教程系列。