前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis Sets

Redis Sets

作者头像
孟斯特
发布2024-01-23 16:41:23
1330
发布2024-01-23 16:41:23
举报
文章被收录于专栏:code人生code人生

原文在这里[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] 孟斯特: /developer/user/6649301

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-01-21,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 孟斯特 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基本命令
  • 示例
  • 教程
  • 限制
  • 性能
  • 替代方案
  • 了解更多
    • References
    相关产品与服务
    云数据库 Redis
    腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
    http://www.vxiaotou.com