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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303022.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从小害怕数学的他,却成为了科普数学教育的数学家

谈到数学,你们会想到什么?也许部分模友们会想到数学上的公式、定理、几何图形、微积分等等,也许会有模友们想到高数,(多数大学生的痛)也许大家还会想起高中数学老师课堂上的“循循教诲”——看书干嘛&#…

工作原理是什么_磁翻板液位计工作原理是什么?

液位计​大家都知道,是用来测量介质液位的仪表​,但是说到磁翻板液位计​这个概念可能大家都比较陌生,​磁翻板液位计​是根据浮力原理(阿基米德定律)结合磁性耦合作用研制而成,当被测量容器中的液位升降时,液位计主导…

我们该如何学习机器学习中的数学

数学在机器学习中非常重要,不论是在算法上理解模型代码,还是在工程上构建系统,数学都必不可少。通常离开学校后很难有机会静下心学习数学知识,因此我们最好能通过阅读小组或读书会等形式营造环境,并专注学习那些在实践…

标准梯度—lhMorpGradient

标准梯度 5*5正方形结构元素 标准梯度 7*7正方形结构元素 函数:lhMorpGradient 说明:形态学基本梯度运算,通过结构元素的改变,可以进行厚梯度,方向梯度等形态学计算 参数: src 输入图像 dst 输出图像 eleme…

神州云科DCN存储管理IP_干货!DCN校园网大二层解决方案详解

安徽水利水电职业技术学院始建于195年,是全国100所和安徽省3所国家示范性高职院校之一。学院坐落于安徽省省会合肥,交通便利,环境优美。校内设有九大实训中心,拥有实践性教学所必须的各类实验室、实训室、实习工厂等130个&#xf…

国产数据库占央采九成份额

3月,中央政府采购网发布《中国国家机关2021年数据库软件协议供货采购项目》成交公告,从入选采购名录的企业来看,除甲骨文和微软之外,其余入围的三十家企业均为本土企业。三十家本土企业中,既有阿里这种互联网巨头&…

应对程序员面试,你必须知道的8大数据结构

瑞士计算机科学家Niklaus Wirth在1976年写了一本书,名为《算法数据结构编程》。40多年后,这个等式仍被奉为真理。这就是为什么在面试过程中,需要考察软件工程师对数据结构的理解。几乎所有的问题都需要面试者对数据结构有深刻的理解。无论你是…

Windows Phone 知识锦(12月版)

很久没有更新Windows Phone 知识锦了,今天更新一下:将不同分类的文章进行归类,方便大家查看。 相信大家都喜欢jeffblankenburg的windows phone 31日开放谈吧,之前金山将它反映为中文了。如今他有退出了Mango版的31日开发谈&#…

自由、开源及其敌人 —— RMS事件簿

点击上方“开源社”关注我们| 作者:庄表伟| 编辑:沈于蓝| 设计:朱亿钦目前国际开源界和一些开源软件基金会对于道德和平权的争论正方兴未艾,我们觉得值得关注与了解。前置申明这是一篇严肃的八卦文,希望搞清楚一些社区…

Google 机器学习应用的43条经验法则

Google 的研究科学家 Martin Zinkevich 曾在 NIPS 2016 Workshop 分享了谷歌机器学习实践的四十三条法则。Martin Zinkevich 也在自己的博客上分享了这四十三条经验法则。文章《Rules of Machine Learning: Best Practices for ML Engineering》旨在帮助具备机器学习基础知识的…

lua虚拟机字节码修改_Java虚拟机(JVM)面试题大集合

本文整理自:ThinkWon 链接:blog.csdn.net/ThinkWon/article/details/104390752本文知识目录1、Java内存区域说一下 JVM 的主要组成部分及其作用?说一下 JVM 运行时数据区深拷贝和浅拷贝说一下堆栈的区别?队列和栈是什么&#xff…

SQL Server CDC配合Kafka Connect监听数据变化

写在前面好久没更新Blog了,从CRUD Boy转型大数据开发,拉宽了不少的知识面,从今年年初开始筹备、组建、招兵买马,到现在稳定开搞中,期间踏过无数的火坑,也许除了这篇还很写上三四篇。进入主题,通…

惊喜开学季,教你如何在人工智能时代站稳脚跟!

暑假咻地一下过完啦,前几天,小天介绍了关于数模课程的开学季限时优惠(传送门),今天要介绍的是python课程。接下来,小天来详细说明一下!领取方式:公众号后台对话框回复“人工智能”免…

矢量合成和分解的法则_力的合成与分解专题解析,寒假复习!

合力与分力如果几个力共同作用在物体上产生的效果与一个力单独作用在物体上产生的效果相同,则把这个力叫做这几个力的合力,而那几个力叫做这一个力的分力。合力与分力的关系是等效替代关系,即一个力若分解为两个分力,在分析和计算…

.NET WebSocket 核心原理初体验

上个月我写了《.NET gRPC核心功能初体验》, 里面使用gRPC双向流做了一个打乒乓球的Demo, [实时][双向]这两个标签是不是很熟悉,对, WebSockets也可以做实时双向通信。本文将利用WebSockets(SignalR的一部分)搭建一个可双向通信的A…

CvBlobDetector 新目标检测算法简析

CvBlobDetector用于检测和判定当前帧中的Blob是否是新产生的目标,方法如下:

原来这些流弊的老板,曾经还是牛逼的程序猿!

“生活就像巧克力,你永远不知道下一颗是什么味道”,这句话用在互联网最适合不过,互联网从人类里面创造了一批神,说起他们的名字无人不知,但是你可知道这些神曾经也只是一个名不见经传的程序员。一起来看看他们是怎么一…

phpstormp新建PHP保存在哪里_记一次windows配置PHP环境

前言因为疫情原因一直不能回学校,电脑还在学校宿舍,所以在笔记本上搭建PHP环境,总不能在家混吃等死吧。正文【0】安装Apache2.40-0:Apache的下载链接The Apache HTTP Server Project0-1:点击a number of third party vendors下载window版本0-…

通过Dapr实现一个简单的基于.net的微服务电商系统(六)——一步一步教你如何撸Dapr之Actor服务...

我个人认为Actor应该是Dapr里比较重头的部分也是Dapr一直在讲的所谓“stateful applications”真正具体的一个实现(个人认为),上一章讲到有状态服务可能很多同学看到后的第一反应是“不就是个分布式缓存吗”。那今天就讲讲Actor,看看这个东西…

想转行人工智能?哈佛博士后有话说!

从17年开始,各大高校的数据科学与大数据技术专业持续火爆,2018年,北京大学、西安交通大学等高校更在本科阶段设立人工智能一级学科,中国顶尖人才的流向在悄然改变……据目前最新的数据显示,AI行业开发人员的月薪基本上…