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

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

sadd article:type:typeid articleid

sadd article:type:1 "2"
sadd article:type:1 "3"
sadd article:type:1 "4"

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

zadd article:score score articleid

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存在,就被覆盖。

zinterstore article:score:1 2 article:type:1 article:score aggregate max

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


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

zrevrange article:score:1 0 -1

2.zunionstore-并集

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

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应该设置过期时间,短时间查询,应该不做交集或并集操作,过期后,才重新做计算。

【Redis】有序集合的交集与并集相关推荐

  1. 五Redis 有序集合

    有序集合 按照元素的分 值来有序地 储存各不相同的元素. 有序集合(soted set / zset) 有序集合和集合一样,都可以包含任意数量的.各不相同的元素( element),不同于集合的是,有 ...

  2. redis有序集合键(数据结构篇)

    文章目录 有序集合(soted set / zset) 有序集合示例 基本操作 添加元素 删除元素 返回元素的分值 增加或减少元素的分值 返回有序集合的基数 返回元素的排名(rank) 返回元素的逆序 ...

  3. Python 操作redis有序集合

    #coding:utf8 import redis r =redis.Redis(host="23.226.74.190",port=63279,password="66 ...

  4. Redis 命令--Redis有序集合(sorted set)

    Redis有序集合(sorted set) Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过分 ...

  5. Redis学习---(11)Redis 有序集合(sorted set)

    Redis 有序集合(sorted set) Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过 ...

  6. php redis sorted set,Redis 有序集合(sorted set)

    Redis 有序集合(sorted set) Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过 ...

  7. Redis有序集合(sorted set)使用

    有序集合说明 Redis的有序集合(sorted set),同时具有"有序"和"集合"两种性质,这种数据结构中的每个元素都由一个成员和和一个与成员相关联的分值组 ...

  8. Redis有序集合详解

    有序集合和集合类似,只是说它是有序的,和无序集合的主要区别在于每一个元素除了值之外,它还会多一个分数.分数是一个浮点数,在 Java 中是使用双精度表示的,根据分数,Redis 就可以支持对分数从小到 ...

  9. 模拟 python用redis有序集合实现手机销量排名

    模拟 python用redis有序集合实现手机销量排名 import redisr = redis.Redis(host='127.0.0.1',port=6379,db=0)#记录各手机累计销量 # ...

最新文章

  1. 预告 · Flutter Live 2018 全球同步直播
  2. python 获取文件后缀名的方法
  3. 【Linux】25.ubuntu使用 nethogs 监测网络流量情况
  4. 1859. 将句子排序
  5. 活动目录应用篇一:使用windows server 2008 backup备份AD是的账户权限问题
  6. MVC 3 基本操作增加修改
  7. MySQL Workbench 使用 (3):数据库备份与恢复
  8. python importlib qpython_Python imports指南:Python的导入有更好的理解
  9. 详解Javascript的继承实现
  10. catia 二次开发:高版本的catia vba项目在低版本的catia上运行,报错
  11. AdMob Mediation
  12. Element-Ui组件 Radio 单选框 修改点击激活时的文本颜色,填充色和边框色
  13. OCAD应用:双高斯照相物镜半部结构设计
  14. Java GridBagLayout(网格包布局管理器)
  15. 第三章微分中值定理与导数应用
  16. mysql server 安装及配置_mysql server的安装和配置
  17. leetcode算法(2)
  18. PRD到底该怎么写?更全面的文档范例来了
  19. 《Oracle Java EE编程自学和面试指南》09-02:HttpSession接口
  20. 深度学习模型训练的时候,一般把epoch设置多大?深度模型中的超参数要如何调整?模型训练的诸多问题?

热门文章

  1. asp.net 日期转换
  2. Ajax跨域提交JSON和JSONP
  3. 子类访问父类和方法覆写
  4. MFC 单选按钮Radio使用注意
  5. 超棒的在线Bootstrap主题编辑工具 - lollytin
  6. keil之编辑环境配置
  7. 装上了Visual Studio 2005
  8. linux文件句柄,【LINUX】使用lsof处理文件恢复、句柄以及空间释放问题
  9. Unity中Time.deltaTime的含义及其应用
  10. android sim iso,android – 意外的telephonyManager.getSimCountryIso()行为