(书)如何管理redis数据库-8.如何在Redis中管理集合
介绍
Redis是一个开源的内存中键值数据存储。设置在Redis的是储存在一个给定的钥匙串的集合。当保存在一个集合中时,单个记录值称为_成员_。与列表不同,集合是无序的,并且不允许重复的值。
本教程说明如何创建集合,检索和删除成员以及比较不同集合的成员。
如何使用本指南
本指南以备有完整示例的备忘单形式编写。我们鼓励您跳至与您要完成的任务相关的任何部分。
本指南中显示的命令已在运行Redis版本的Ubuntu 18.04服务器上进行了测试 4.0.9。要设置类似的环境,您可以按照我们的指南如何在Ubuntu 18.04上安装和保护Redis的步骤1进行操作。我们将通过使用Redis命令行界面运行它们来演示这些命令的行为。请注意,如果您使用其他Redis界面(例如Redli),则某些命令的确切输出可能会有所不同。redis-cli
另外,您可以提供一个托管的Redis数据库实例来测试这些命令,但是请注意,根据数据库提供者所允许的控制级别,本指南中的某些命令可能无法按所述方式工作。要配置DigitalOcean托管数据库,请遵循我们的托管数据库产品文档。然后,您必须 安装Redli 或 设置TLS隧道才能通过TLS连接到托管数据库。
创建集合
该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。
从集合中检索成员
在本节中,我们将介绍一些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
要查看给定集合中有多少成员(换句话说,找到给定集合的_基数_),请运行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的带有用于从一组删除成员三个命令:spop
,srem
,和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还提供了许多命令来查找集合之间的差异和相似性。为了演示如何工作的,这部分将引用一个名为三套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
Output
1) "John" 2) "George"
sinterstore
执行类似的功能,但不是返回相交成员,而是在包含这些相交成员的指定目的地创建了一个新集合。请注意,如果目的地已经存在,sinterstore
将覆盖其内容:
* sinterstore new_set presidents kings beatles
* smembers new_set
Output
1) "John" 2) "George"
sdiff
返回_集合差异_—由以下每个集合的第一个指定集合的差异得出的成员:
* 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"
像一样sinterstore
,sdiffstore
将覆盖目标键(如果已存在)。
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
和一样sdiffstore
,sunionstore
如果目标键已经存在,它将覆盖目标键。
结论
本指南详细介绍了用于在Redis中创建和管理集的许多命令。如果您想在本指南中概述其他相关的命令,参数或过程,请在下面的注释中提出疑问或提出建议。