前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Redis】有序集合的交集与并集

【Redis】有序集合的交集与并集

作者头像
DDGarfield
发布2022-06-23 19:40:01
9270
发布2022-06-23 19:40:01
举报
文章被收录于专栏:加菲的博客加菲的博客

Redis支持多种类型的数据结构,最简单的字符串(strings),适合存储对象的哈希(hash),简单的字符串列表(list),无序集合(set),有序集合(sorted set),以及用于做基数统计的HyperLogLog,其中使用频率相对较高的便是集合。

无论是无序集合set,还是有序集合zset,集合内的元素都具有唯一性,如果插入相同的元素,都将被忽略。有时候通过业务逻辑直接存储的集合,并不能满足所有的业务需求。比如博客园可以按分类存储一个set,元素为文章id:

sadd article:type:typeid articleid

代码语言:javascript
复制
sadd article:type:1 "2"
sadd article:type:1 "3"
sadd article:type:1 "4"

按文章的点赞与踩计算出文章分数的有序集合,元素为文章id

zadd article:score score articleid

代码语言:javascript
复制
zadd article:score 10 "2"
zadd article:score 20 "3"
zadd article:score 2 "4"
zadd article:score 1 "5"
zadd article:score 5 "6"

但是如果我们需要在分类下的文章按照分数重新进行排序,怎么办?既然是集合,我们能想到操作就是,取交集,并集,差集。

1.zinterstore-交集

取这俩集合的交集,就可以完成上面的需求。

zinterstore 可以计算多个有序集合的交集(无序集合的score为0),并生成新的有序集合。

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [SUM|MIN|MAX]

  • numkey:操作的集合数
  • weights:是一个可选参数,乘法因子
  • aggregate:聚合,默认是求和SUM

如果destination新key存在,就被覆盖。

代码语言:javascript
复制
zinterstore article:score:1 2 article:type:1 article:score aggregate max

计算上面两个集合的交集,以取最大值的方式聚合。

然后就可以通过zrevrange命令按分数从大到小:

代码语言:javascript
复制
zrevrange article:score:1 0 -1

2.zunionstore-并集

上面在交集中没有用到乘法因子,我们将在并集中介绍:乘法因子用于所有的元素的score值在传递给聚合函数之前都要先乘以这个因子,说白了,先weightsaggregate。我们就用官方示例说明:

代码语言:javascript
复制
redis> ZADD zset1 1 "one"
(integer) 1
redis> ZADD zset1 2 "two"
(integer) 1
redis> ZADD zset2 1 "one"
(integer) 1
redis> ZADD zset2 2 "two"
(integer) 1
redis> ZADD zset2 3 "three"
(integer) 1
redis> ZUNIONSTORE out 2 zset1 zset2 WEIGHTS 2 3
(integer) 3
redis> ZRANGE out 0 -1 WITHSCORES
1) "one"
2) "5"
3) "three"
4) "9"
5) "two"
6) "10"
redis> 

按交集操作,keyout的元素只会有one two,但是如果取并集,元素就会有one two three ,默认聚合函数为SUM

所以最终元素:

  • one
    • 1x2=2
    • 1x3=3
    • SUM(2+3)=5
  • two
    • 2x2=4
    • 2x3=6
    • SUM(4+6)=10
  • two
    • 0x2=2
    • 3x3=9
    • SUM(0+9)=9

3.总结

无论是取交集还是并集

  • 以元素为基准做并集与交集操作
  • score值先与weights乘法因子计算,如果有指定乘法因子的
  • 执行聚合函数,aggregate(),默认SUM,还有MIN MAX

ps:集合操作是要花费时间的,实际操作时,生成的集合key应该设置过期时间,短时间查询,应该不做交集或并集操作,过期后,才重新做计算。

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

本文分享自 加菲的博客 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.zinterstore-交集
  • 2.zunionstore-并集
  • 3.总结
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档