文档:集合

集合是唯一字符串(成员)的无序集合。您可以高效地使用集合来

  • 跟踪唯一项目(例如,跟踪访问给定博客文章的所有唯一 IP 地址)。
  • 表示关系(例如,具有给定角色的所有用户的集合)。
  • 执行常见的集合操作,如交集、并集和差集。

基本命令

  • SADD 将新成员添加到集合中。
  • SREM 从集合中移除指定成员。
  • SISMEMBER 测试字符串是否为集合成员。
  • SINTER 返回两个或多个集合共有的成员集合(即交集)。
  • SCARD 返回集合的大小(又称基数)。

请参阅完整的集合命令列表

示例

  • 存储在法国和美国参赛的自行车集合。请注意,如果您添加已存在的成员,它将被忽略。
127.0.0.1:6379> SADD bikes:racing:france bike:1
(integer) 1
127.0.0.1:6379> SADD bikes:racing:france bike:1
(integer) 0
127.0.0.1:6379> SADD bikes:racing:france bike:2 bike:3
(integer) 2
127.0.0.1:6379> SADD bikes:racing:usa bike:1 bike:4
(integer) 2
  • 检查 bike:1 或 bike:2 是否在美国参赛。
127.0.0.1:6379> SISMEMBER bikes:racing:usa bike:1
(integer) 1
127.0.0.1:6379> SISMEMBER bikes:racing:usa bike:2
(integer) 0
  • 哪些自行车同时参加了两场比赛?
127.0.0.1:6379> SINTER bikes:racing:france bikes:racing:usa
1) "bike:1"
  • 有多少自行车在法国参赛?
127.0.0.1:6379> SCARD bikes:racing:france
(integer) 3

教程

SADD 命令将新元素添加到集合中。还可以对集合执行许多其他操作,例如测试给定元素是否已存在、执行多个集合之间的交集、并集或差集等。

127.0.0.1:6379> SADD bikes:racing:france bike:1 bike:2 bike:3
(integer) 3
127.0.0.1:6379> SMEMBERS bikes:racing:france
1) bike:3
2) bike:1
3) bike:2

这里我向我的集合添加了三个元素,并告诉 Valkey 返回所有元素。集合没有顺序保证。Valkey 可以在每次调用时以任何顺序返回元素。

Valkey 具有测试集合成员资格的命令。这些命令可用于单个和多个项目。

127.0.0.1:6379> SISMEMBER bikes:racing:france bike:1
(integer) 1
127.0.0.1:6379> SMISMEMBER bikes:racing:france bike:2 bike:3 bike:4
1) (integer) 1
2) (integer) 1
3) (integer) 0

我们还可以找到两个集合之间的差集。例如,我们可能想知道哪些自行车在法国参赛但不在美国参赛。

127.0.0.1:6379> SADD bikes:racing:usa bike:1 bike:4
(integer) 2
127.0.0.1:6379> SDIFF bikes:racing:france bikes:racing:usa
1) "bike:3"
2) "bike:2"

还有一些非平凡的操作,使用正确的 Valkey 命令仍然很容易实现。例如,我们可能需要一个在法国、美国和一些其他比赛中参赛的所有自行车的列表。我们可以使用 SINTER 命令来完成此操作,该命令执行不同集合之间的交集。除了交集之外,您还可以执行并集、差集等。例如,如果添加第三场比赛,我们可以看到其中一些命令的实际应用。

127.0.0.1:6379> SADD bikes:racing:france bike:1 bike:2 bike:3
(integer) 3
127.0.0.1:6379> SADD bikes:racing:usa bike:1 bike:4
(integer) 2
127.0.0.1:6379> SADD bikes:racing:italy bike:1 bike:2 bike:3 bike:4
(integer) 4
127.0.0.1:6379> SINTER bikes:racing:france bikes:racing:usa bikes:racing:italy
1) "bike:1"
127.0.0.1:6379> SUNION bikes:racing:france bikes:racing:usa bikes:racing:italy
1) "bike:2"
2) "bike:1"
3) "bike:4"
4) "bike:3"
127.0.0.1:6379> SDIFF bikes:racing:france bikes:racing:usa bikes:racing:italy
(empty array)
127.0.0.1:6379> SDIFF bikes:racing:france bikes:racing:usa
1) "bike:3"
2) "bike:2"
127.0.0.1:6379> SDIFF bikes:racing:usa bikes:racing:france
1) "bike:4"

您会注意到,当所有集合的差集为空时,SDIFF 命令返回一个空数组。您还会注意到,传递给 SDIFF 的集合顺序很重要,因为差集不具有交换性。

当您想从集合中移除项目时,可以使用 SREM 命令移除一个或多个项目,或者使用 SPOP 命令从集合中移除一个随机项目。您还可以使用 SRANDMEMBER 命令从集合中返回一个随机项目而不将其移除。

127.0.0.1:6379> SADD bikes:racing:france bike:1 bike:2 bike:3 bike:4 bike:5
(integer) 5
127.0.0.1:6379> SREM bikes:racing:france bike:1
(integer) 1
127.0.0.1:6379> SPOP bikes:racing:france
"bike:3"
127.0.0.1:6379> SMEMBERS bikes:racing:france
1) "bike:2"
2) "bike:4"
3) "bike:5"
127.0.0.1:6379> SRANDMEMBER bikes:racing:france
"bike:2"

限制

集合的最大大小为 2^32 - 1 (4,294,967,295) 个成员。

性能

大多数集合操作,包括添加、删除和检查项目是否为集合成员,都是 O(1)。这意味着它们效率很高。但是,对于包含数十万个或更多成员的大型集合,在运行 SMEMBERS 命令时应谨慎。此命令是 O(n),并在单个响应中返回整个集合。作为替代方案,请考虑使用 SSCAN,它允许您迭代地检索集合的所有成员。