redis延迟队列 实现_灵感来袭,基于Redis的分布式延迟队列

b615ba0aa589932dab72a388715f5c33.png

一、延迟队列

延迟队列,也就是一定时间之后将消息体放入队列,然后消费者才能正常消费。比如1分钟之后发送短信,发送邮件,检测数据状态等。

二、Redisson Delayed Queue

如果你项目中使用了redisson,那么恭喜你,使用延迟队列将非常的简单。

d828ca87cb821e87e7515e6225fed73d.png

基于Redis的Redisson分布式延迟队列(Delayed Queue)结构的RDelayedQueue Java对象在实现了RQueue接口的基础上提供了向队列按要求延迟添加项目的功能。该功能可以用来实现消息传送延迟按几何增长或几何衰减的发送策略。

RQueue<String> distinationQueue = ...
RDelayedQueue<String> delayedQueue = getDelayedQueue(distinationQueue);
// 10秒钟以后将消息发送到指定队列
delayedQueue.offer("msg1", 10, TimeUnit.SECONDS);
// 一分钟以后将消息发送到指定队列
delayedQueue.offer("msg2", 1, TimeUnit.MINUTES);

在该对象不再需要的情况下,应该主动销毁。仅在相关的Redisson对象也需要关闭的时候可以不用主动销毁。

三、Java DelayQueue

DelayQueue它本质上是一个队列,而这个队列里也只有存放Delayed的子类才有意义。

28424500e985bed6ba31f4943c415fca.png

延迟队列demo

public class DelayTask implements Delayed {private long startDate;public DelayTask(Long delayMillions) {this.startDate = System.currentTimeMillis() + delayMillions;}@Overridepublic int compareTo(Delayed o) {Long.compare(this.getDelay(TimeUnit.NANOSECONDS), o.getDelay(TimeUnit.NANOSECONDS));}@Overridepublic long getDelay(TimeUnit unit) {return this.startDate - System.currentTimeMillis();}public static void main(String[] args) throws Exception {BlockingQueue<DelayTask> queue = new DelayQueue<>();DelayTask delayTask = new DelayTask(1000 * 5L);queue.put(delayTask);while (queue.size()>0){queue.take();}}
}

延迟队列消费原理

8a2e87c23d688d02b6f4129ab8ffcd28.png

源码中出现了三次await字眼:

  • 第一次是当队列为空时,等待;
  • 第二次等待是因为,发现有任务,没有到执行时间,并且有准备执行的线程(leader),那不好意思,还得接续等待直到下一个可执行的任务。
  • 第三次是真正延时的地方了,available.awaitNanos(delay),此时也没有别的线程要执行,也就是我将要执行,等待剩下的延迟时间即可。

延迟队列生产原理

371db2348aa02d4ff30ced0829dd99dc.png

为保证消费者正常消费,如果优先队列头元素和当前放入元素相等,则说明当前元素消费的优先级高,重置准备消费的线程(leader)为null,唤醒消费者线程重新执行take方法逻辑。

四、手写一个Redis延迟队列

Redis延迟队列设计

0dc888b2ddc903461edec8740abb8bfb.png

延迟消息体设计

88247bc0bedd932e570ca07033c03de7.png

延迟消息体Message实现了Delayed接口,这样Java DelayQueue就知道什么时候取出消息体。

Redis延迟队列实现

dc8e4b580151ae7681a77e977881de7e.png

RedisDelayQueue构造函数依赖redis操作缓存服务对象目标队列名称(redis key)。

offer方法传入member(具体消息),delay(延迟时间),timeUnit(时间单位),然后封装成延迟消息体Message对象,放入Java DelayQueue中。

run方法是一个循环体,不断的从Java DelayQueue对象中获取消息体,然后放入redis对应的目标队列里。

延迟队列测试demo

cf6b0049b2696c1a68c2cf9a21722ac5.png

控制台打印效果

1fc961ef0313c9e86398d72360fc2957.png

五、思考

这种方案实现比较简单,使用的时候一定要谨慎,应用于延迟小,消息量不大的场景是没问题的,毕竟Java DelayQueue是占用内存的。另外也可以考虑利用Redis的sorted set 结构实现延迟队列,使用TimeStamp作为score,比如你的任务是要延迟5分钟,那么就在当前时间上加5分钟作为 score ,轮询任务每秒只轮询 score 小于等于 当前时间的 key即可,如果任务支持有误差,那么当没有扫描到有效数据的时候可以休眠对应时间再继续轮询。

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

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

相关文章

opencv2 取二进制数据_百亿数据量下,掌握这些Redis技巧你就能Hold全场

程序猿DD一、Redis封装架构讲解实际上NewLife.Redis是一个完整的Redis协议功能的实现&#xff0c;但是Redis的核心功能并没有在这里面&#xff0c;而是在NewLife.Core里面。这里可以打开看一下&#xff0c;NewLife.Core里面有一个NewLife.Caching的命名空间&#xff0c;里面有一…

MV-LDL论文修改20211115(B-Y Rong)

1、摘要 8-10句&#xff0c;每句话15-25个单词 &#xff08;1&#xff09;我们的研究领域。。。 &#xff08;2&#xff09;已有的工作。。。 &#xff08;3&#xff09;有什么缺点。。。&#xff08;motivation&#xff09; &#xff08;4&#xff09;In this paper … &#…

Data Poisoning Attacks to Deep Learning Based Recommender Systems论文解读

1 摘要 在这项工作中&#xff0c;作者对基于深度学习的推荐系统的数据中毒攻击进行了首次系统研究。攻击者的目标是操纵推荐系统&#xff0c;以便向许多用户推荐攻击者选择的目标项目。为了实现这一目标&#xff0c;作者将精心设计的评分注入到推荐系统中的假用户。具体来说&a…

黑马商城项目源代码_Python学习路线图--Python框架与项目

Python学习路线图的Python框架部分主要有Django框架和Flask框架&#xff0c;学完这一部分就可以去找Web全栈工程师的工作了&#xff0c;独立开发前端和后端业务。Python学习路线图的Django框架部分需要掌握Web主流框架-Django的使用&#xff1b;可根据Web框架设计&#xff0c;开…

Membership Inference Attacks Against Recommender Systems论文解读

0 摘要 推荐系统通常针对高度敏感的用户数据进行训练&#xff0c;因此推荐系统潜在的数据泄露可能会导致严重的隐私问题。 本文首次尝试通过成员推理的角度来量化推荐系统的隐私泄漏。 与针对机器学习分类器的传统成员推理相比&#xff0c;本文的攻击面临两个主要差异。 首先&…

k近邻推荐用到的各种距离

1 kkk-近邻推荐原理 2 各种距离 2.1 欧几里得距离 d12(x1−x2)2(y1−y2)2d_{12} \sqrt{(x_{1} - x_{2})^2 (y_{1} - y_{2})^2}d12​(x1​−x2​)2(y1​−y2​)2​ 缺点&#xff1a;欧式距离是一种常用的距离度量&#xff0c;但它并不是尺度不变的&#xff0c;这意味着所计算…

stacking模型融合_【干货】比赛后期大招之stacking技术分享

各位同学大家好&#xff0c;我是本次参赛选手李博&#xff0c;比赛ID是深蓝&#xff08;DeePBluE&#xff09;。现在就读于北京邮电大学&#xff0c;是一名研一的在校生&#xff0c;研究方向是数据分析和机器学习。是的&#xff0c;我又来分&#xff08;na&#xff09;享&#…

多stream_基础之Lambda和Stream的邂逅

基础之Lambda和Stream的邂逅show me the code and take to me,做的出来更要说的明白GitHub项目JavaHouse同步收录喜欢就点个赞呗! 你的支持是我分享的动力&#xff01;引入是否有遇到看不懂身边同事代码的情况&#xff0c;是否有被面试官问到 Java 新特性不懂的情况。我掐指一算…

注意力机制--转载自我的学生隆兴写的博客

原文链接为&#xff1a;https://a-egoist.com/posts/a44b8419/&#xff0c;学生自己搭建的博客&#xff0c;点赞&#xff01; 1 Attention 1.1 什么是 Attention 灵长类动物的视觉系统中的视神经接受了大量的感官输入。在检查视觉场景时&#xff0c;我们的视觉神经系统大约每…

推荐系统--矩阵分解(1)

推荐系统–矩阵分解(1) 推荐系统–矩阵分解(2) 推荐系统–矩阵分解(3) 推荐系统–矩阵分解(4) 推荐系统–矩阵分解(5) 推荐系统–矩阵分解(6) 1 引入 一个矩阵可以分解为两个小矩阵的乘积&#xff0c;以音乐为例&#xff0c;利用潜在特征向量来给用户和音乐打上标签&#xff…

Yolo家族算法分析

1 历史简介 2 YOLO算法思想 YOLO算法的基本思想&#xff1a; &#xff08;1&#xff09;将图片划分为SSS \times SSS个网格&#xff1b; &#xff08;2&#xff09;计算每个边界框和置信度&#xff1b; &#xff08;3&#xff09;计算每个网格属于某个类别的概率&#xff1b; &…

u8 附件上传后存放路径_织梦DedeCms附件按月份保存的修改方法

正常情况下&#xff0c;dedecms织梦系统的图片附件是按日保存的&#xff0c;一天一个文件夹, 时间长了, 这样在allimg中就会生成很多文件夹, 不方便管理&#xff0e;虽然&#xff0c;dedecms织梦的后台设置有”附件保存形式”的先项, 但功能太弱&#xff0c;如果是在后台上传和…

推荐系统--矩阵分解(2)

推荐系统–矩阵分解(1) 推荐系统–矩阵分解(2) 推荐系统–矩阵分解(3) 推荐系统–矩阵分解(4) 推荐系统–矩阵分解(5) 推荐系统–矩阵分解(6) 3 BiasSVD&#xff1a;考虑偏置 有一些用户会给出偏高的评分&#xff0c;有一些物品也会收到偏高的评分&#xff0c;比如电影观众为…

tga文件怎么打开_教你win10系统怎么打开stp文件

stp文件怎么打开呢&#xff1f;近来有很多小伙伴反映有朋友发送了一个stp文件给它&#xff0c;搞了半天也没能打开。其实打开stp文件很简单&#xff0c;不过前提是需要有绘图软件。我给大家整理了打开stp文件的图文教程&#xff0c;赶紧来瞧瞧吧有些朋友在使用win10系统的过程中…

推荐系统--矩阵分解(4)

推荐系统–矩阵分解(1) 推荐系统–矩阵分解(2) 推荐系统–矩阵分解(3) 推荐系统–矩阵分解(4) 推荐系统–矩阵分解(5) 推荐系统–矩阵分解(6) 7 基于情感分析的矩阵分解 7.1 引入 【摘要】推荐系统旨在基于丰富的信息预测用户的偏好&#xff0c;例如用户评分、人口统计和评论…

yarn 卸载包_0609-6.1.0-如何卸载CDH6.1

1.文档编写目的Fayson在两年前的文章中介绍过CDH的卸载&#xff0c;参考《如何卸载CDH(附一键卸载github源码)》。除非你是使用Cloudera官方提供的一键安装脚本安装的CDH&#xff0c;否则并没有现成的一键卸载的脚本供使用。为了更好的理解CDH的卸载&#xff0c;这里再次简单介…

xss跨站脚本攻击_网络安全xss跨站脚本攻击原理

以下在未经授权的网站操作均为违法行为XSS跨站脚本攻击xss的危害网络钓鱼&#xff0c;盗取各类账号密码我们先来看一下下面的案例&#xff1a;先来记住一下下面中的表我们来做一个转发上面页面显示已经登录&#xff0c;但是突然页面中提醒再此登录此时&#xff0c;我们并没有多…

推荐系统--联邦学习下的矩阵分解(6)

推荐系统–矩阵分解(1) 推荐系统–矩阵分解(2) 推荐系统–矩阵分解(3) 推荐系统–矩阵分解(4) 推荐系统–矩阵分解(5) 推荐系统–矩阵分解(6) 9 应用于联邦学习的矩阵分解 这个部分主要参考以下两篇论文&#xff1a; 2008-Collaborative Filtering for Implicit Feedback Dat…

什么是联邦学习

联邦学习 1.1 联邦学习的概念 历史&#xff1a;联邦学习最早在 2016 年由谷歌提出&#xff0c;原本用于解决安卓手机终端用户在本地更新模型的问题&#xff1b; 本质&#xff1a;联邦学习本质上是一种分布式机器学习技术&#xff0c;或机器学习框架。 目标&#xff1a;联邦学…

循环自增_大学C语言—循环结构及应用

基础知识常见循环结构及形式for循环for(设置初始值&#xff1b;循环条件判断&#xff1b;设置循环增减量){语句1&#xff1b;语句2&#xff1b;…… 语句n&#xff1b;}while循环while(条件判断){语句1&#xff1b;语句2&#xff1b;……语句n&#xff1b;}do-while循环d…