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,一经查实,立即删除!

相关文章

MNTD论文修改20211114(Y Zhou)

2 Preliminaries 2.1 Network traffic detection 2.2 Multi-instance learning 1、5-10句&#xff0c;一个句子15-25个单词。 2、 Results show that our algorithm is more efficient while maintains good accuracy. And, the influence of packet size and the ratio …

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 … &#…

python数字类型floatcomplexint_浅谈python 四种数值类型(int,long,float,complex)

Python支持四种不同的数值类型&#xff0c;包括int(整数)long(长整数)float(浮点实际值)complex (复数)&#xff0c;本文章向码农介绍python 四种数值类型&#xff0c;需要的朋友可以参考一下。数字数据类型存储数值。他们是不可改变的数据类型&#xff0c;这意味着改变数字数据…

NSA-LDL论文修改建议20211116(R-T Bai)

1、每一个部分应该有引入 This section first reviews the definition of the rating system. Second, we present the problem statement for collaborative filtering (CF). Finally, we analyze existing approaches for estimating MGBR. 2、the basic statistics of the 1…

python urllib发送post请求_python爬虫 urllib模块发起post请求过程解析

urllib模块发起的POST请求案例&#xff1a;爬取百度翻译的翻译结果1.通过浏览器捉包工具&#xff0c;找到POST请求的url针对ajax页面请求的所对应url获取&#xff0c;需要用到浏览器的捉包工具。查看百度翻译针对某个字条发送ajax请求&#xff0c;所对应的url点击clear按钮可以…

通过一个例子来理解二维码纠错机制

1 例子 假设&#xff1a;原始数据为8位&#xff0c;纠错码为6位&#xff0c;原始信息由原始数据纠错码。 在传输过程中&#xff0c;由于信息干扰等原因&#xff0c;导致原始信息被污染&#xff0c;被污染后有两位数据被修改。 说明编码原始信息001010011011100被污染后的信息…

two sum python_Python | Leetcode 之 Two Sum

说来惭愧&#xff0c;到现在才开始刷Leetcode&#xff0c;但迟到总比不到好。题目&#xff1a;Given an array of integers, return indices of the two numbers such that they add up to a specific target.You may assume that each input would have exactly one solution,…

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

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

python爬虫视频 下载 黑马_Python爬虫能爬视频么(python爬虫零基础视频教程)

Python爬虫能爬视频么他视频没有的&#xff0c;但是跑了之后你要处理这个视频&#xff0c;就是问题的&#xff1f;你只需要&#xff0c;得到视频的播放地址&#xff0c;还是要把视频完整的下载到本地的。如果只是爬那个视频的下载地址&#xff0c;很简单&#xff0c;如果要下载…

机器学习+深度学习相关课程地址总结

1 吴恩达老师 机器学习课程视频链接&#xff1a;https://www.bilibili.com/video/BV164411b7dx?fromsearch&seid8357728122787183773&spm_id_from333.337.0.0作业答案&#xff1a;https://github.com/Ayatans/Machine-Learning-homework深度学习课程&#xff1a;吴恩…

黑马商城项目源代码_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;本文的攻击面临两个主要差异。 首先&…

python分类预测降低准确率_十分钟掌握python机器学习特征选择

十分钟掌握python机器学习特征选择-1.jpg (33.2 KB, 下载次数: 0)2018-6-26 23:01 上传在机器学习中&#xff0c;特征选择是实践中的一步&#xff0c; 帮你在所有特征中选择对结果贡献最多的特征。 显然&#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;这意味着所计算…

python 分类变量回归_极简Python带你探索分类与回归的奥秘

为何使用人工智能和机器学习&#xff1f;地球的未来在于人工智能和机器学习。如果对这些技术一无所知&#xff0c;人们很快会发现自己落伍了。世界发展日新月异&#xff0c;每天都发生着不可思议的变化。在人工智能和机器学习中&#xff0c;有许多实现和技术能够解决实时问题。…

Fast Matrix Factorization for Online Recommendation with Implicit Feedback论文代码分析

1 数据结构 userCount&#xff1a;用户数 itemCount&#xff1a;项目数 user_ratings&#xff1a;ArrayList<ArrayList>&#xff0c; 问&#xff1a;此处为什么要用二维数组&#xff1f; 答&#xff1a;第1维是用户&#xff0c;第2维是用户对所有项目的评分。 testRatin…

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;我们的视觉神经系统大约每…