Redis Sets

2024-01-23 16:41:23 浏览数 (1)

原文在这里[1]。

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

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

基本命令

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

详见完整的列表命令[2]。

示例

•存储在法国和美国参加比赛的自行车的集合。请注意,如果添加一个已经存在的成员,它将被忽略。

代码语言:javascript复制
> 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是否在美国参加比赛。

代码语言:javascript复制
> SISMEMBER bikes:racing:usa bike:1
(integer) 1
> SISMEMBER bikes:racing:usa bike:2
(integer) 0

•哪些自行车在两场比赛中都参加?

代码语言:javascript复制
> SINTER bikes:racing:france bikes:racing:usa
1) "bike:1"

•多少自行车参加了France的比赛?

代码语言:javascript复制
> SCARD bikes:racing:france
(integer) 3

教程

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

代码语言:javascript复制
> 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有用于测试集合成员资格的命令。这些命令可以用于单个项目和多个项目:

代码语言:javascript复制
> 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比赛:

代码语言:javascript复制
> 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命令来执行不同集合之间的交集。除了交集之外,还可以执行并集、差集等操作。例如,如果我们添加第三场比赛,我们可以看到其中一些命令的效果:

代码语言:javascript复制
> 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命令在不删除它的情况下

返回

集合中的一个随机项目:

代码语言:javascript复制
> 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过滤器[3]作为集合的替代方案。

Redis集合经常被用作一种索引。如果你需要对数据进行索引和查询,请考虑使用JSON[4]数据类型以及搜索和查询[5]功能。

了解更多

•Redis集合解析[6]和Redis集合详解[7]是两个简短但全面的视频解释,涵盖了Redis集合。•Redis University RU101[8]深入探讨了Redis集合。

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)[9]进行许可,使用时请注明出处。 Author: mengbin[10] blog: mengbin[11] Github: mengbin92[12] cnblogs: 恋水无意[13] 腾讯云开发者社区:孟斯特[14]

References

[1] 这里: https://redis.io/docs/data-types/sets/ [2] 完整的列表命令: https://redis.io/commands/?group=set [3] Bloom过滤器或Cuckoo过滤器: https://redis.io/docs/stack/bloom [4] JSON: https://redis.io/docs/stack/json [5] 搜索和查询: https://redis.io/docs/stack/search [6] Redis集合解析: https://www.youtube.com/watch?v=PKdCppSNTGQ [7] Redis集合详解: https://www.youtube.com/watch?v=aRw5ME_5kMY [8] Redis University RU101: https://university.redis.com/courses/ru101/?_ga=2.17182073.130259205.1705572418-889654803.1705481218&_gl=1*1uclell*_ga*ODg5NjU0ODAzLjE3MDU0ODEyMTg.*_ga_8BKGRQKRPV*MTcwNTc1MDM4Ny45LjEuMTcwNTc1MjMxOS41Ny4wLjA.*_gcl_au*MTQzNTAwOTk2LjE3MDU0ODEyMTc. [9] 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0): https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh [10] mengbin: mengbin1992@outlook.com [11] mengbin: https://mengbin.top [12] mengbin92: https://mengbin92.github.io/ [13] 恋水无意: https://www.cnblogs.com/lianshuiwuyi/ [14] 孟斯特: https://cloud.tencent.com/developer/user/6649301

0 人点赞