原文在这里。
Redis集合是唯一字符串(成员)的无序集合。你可以使用Redis集合来高效地:
- 追踪唯一项(例如,跟踪访问特定博客文章的所有唯一IP地址)。
- 表示关系(例如,具有特定角色的所有用户的集合)。
- 执行常见的集合操作,如交集、并集和差集。
基本命令
- SADD添加一个新成员到集合中
- SREM从集合中移除指定成员
- SISMEMBER测试一个字符串是否是集合的成员
- SINTER返回两个或多个集合共有的成员(即交集)
- SCARD返回集合的大小(也称为基数)
详见完整的列表命令。
示例
- 存储在法国和美国参加比赛的自行车的集合。请注意,如果添加一个已经存在的成员,它将被忽略。
> SADD bikes:racing:france bike:1 (integer) 1 > SADD bikes:racing:france bike:1 (integer) 0 > SADD bikes:racing:france bike:2 bike:3 (integer) 2 > SADD bikes:racing:usa bike:1 bike:4 (integer) 2
- 检查自行车1或自行车2是否在美国参加比赛。
> SISMEMBER bikes:racing:usa bike:1 (integer) 1 > SISMEMBER bikes:racing:usa bike:2 (integer) 0
- 哪些自行车在两场比赛中都参加?
> SINTER bikes:racing:france bikes:racing:usa 1) "bike:1"
- 多少自行车参加了France的比赛?
> SCARD bikes:racing:france (integer) 3
教程
SADD命令增加新的元素到集合中。还可以执行其他许多集合操作,比如测试给定元素是否已经存在,对多个集合执行交集、并集或差集等操作。
> SADD bikes:racing:france bike:1 bike:2 bike:3
(integer) 3
> SMEMBERS bikes:racing:france
1) bike:3
2) bike:1
3) bike:2
在这里,我已经向我的集合中添加了三个元素,并告诉Redis返回所有元素。集合没有顺序保证。Redis可以在每次调用时以任何顺序返回元素。
Redis有用于测试集合成员资格的命令。这些命令可以用于单个项目和多个项目:
> SISMEMBER bikes:racing:france bike:1
(integer) 1
> SMISMEMBER bikes:racing:france bike:2 bike:3 bike:4
1) (integer) 1
2) (integer) 1
3) (integer) 0
我们还可以找到两个集合之间的差异。例如,我们可能想知道哪些自行车在France比赛但不在USA比赛:
> SADD bikes:racing:usa bike:1 bike:4
(integer) 2
> SDIFF bikes:racing:france bikes:racing:usa
1) "bike:3"
2) "bike:2"
还有一些非常规的操作,但仍然可以使用正确的Redis命令轻松实现。例如,我们可能想要列出在法国、美国和其他一些比赛中参赛的所有自行车。我们可以使用SINTER命令来执行不同集合之间的交集。除了交集之外,还可以执行并集、差集等操作。例如,如果我们添加第三场比赛,我们可以看到其中一些命令的效果:
> SADD bikes:racing:france bike:1 bike:2 bike:3
(integer) 3
> SADD bikes:racing:usa bike:1 bike:4
(integer) 2
> SADD bikes:racing:italy bike:1 bike:2 bike:3 bike:4
(integer) 4
> SINTER bikes:racing:france bikes:racing:usa bikes:racing:italy
1) "bike:1"
> SUNION bikes:racing:france bikes:racing:usa bikes:racing:italy
1) "bike:2"
2) "bike:1"
3) "bike:4"
4) "bike:3"
> SDIFF bikes:racing:france bikes:racing:usa bikes:racing:italy
(empty array)
> SDIFF bikes:racing:france bikes:racing:usa
1) "bike:3"
2) "bike:2"
> SDIFF bikes:racing:usa bikes:racing:france
1) "bike:4"
你会注意到当所有集合之间的差异为空时,SDIFF命令返回一个空数组。还要注意到传递给SDIFF的集合的顺序很重要,因为差异不是可交换的。
当你想要从集合中删除项目时,可以使用SREM命令从集合中删除一个或多个项目,或者可以使用SPOP命令从集合中删除一个随机项目。你还可以使用SRANDMEMBER命令在不删除它的情况下返回集合中的一个随机项目:
> SADD bikes:racing:france bike:1 bike:2 bike:3 bike:4 bike:5
(integer) 5
> SREM bikes:racing:france bike:1
(integer) 1
> SPOP bikes:racing:france
"bike:3"
> SMEMBERS bikes:racing:france
1) "bike:2"
2) "bike:4"
3) "bike:5"
> SRANDMEMBER bikes:racing:france
"bike:2"
限制
Redis集合的最大长度是$2^{32} - 1(4,294,967,295)$个元素。
性能
大多数集合操作,包括添加、删除和检查项是否为集合成员,都是O(1),这意味着它们非常高效。然而,对于具有数十万个或更多成员的大型集合,在运行SMEMBERS命令时应该小心。该命令是O(n),并以单个响应返回整个集合。作为替代方案,考虑使用SSCAN,它允许你迭代检索集合的所有成员。
替代方案
在大型数据集(或流数据)上进行集合成员检查可能会使用大量内存。如果你关心内存使用并且不需要完全精确性,可以考虑使用Bloom过滤器或Cuckoo过滤器作为集合的替代方案。
Redis集合经常被用作一种索引。如果你需要对数据进行索引和查询,请考虑使用JSON数据类型以及搜索和查询功能。
了解更多
- Redis集合解析和Redis集合详解是两个简短但全面的视频解释,涵盖了Redis集合。
- Redis University RU101深入探讨了Redis集合。
声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意
腾讯云开发者社区:孟斯特