使用Redis实现延时队列

ops/2024/9/24 13:27:24/

redis的zset实现延迟队列
延迟队列是什么?
延时队列相比于普通队列最大的区别就体现在其延时的属性上,普通队列的元素是先进先出,按入队顺序进行处理,而延时队列中的元素在入队时会指定一个延迟时间,表示其希望能够在经过该指定时间后处理。从某种意义上来讲,延迟队列的结构并不像一个队列,而更像是一种以时间为权重的有序堆结构。

实现思路:
要实现延时队列Q,可以使用redis zSet的一些命令,比如生产者生成消息,就加入队列里,先简单用定时任务,通过当前的时间戳获取所有的消息,到期的消息自动消费.
发送消息,添加到队列里

key为队列的名称,score为当前的时间戳加上延迟时间,value为消息体

zadd key score value

根据当前时间戳获取所有的消息数据

key为队列的名称,min为0,max为当前的时间戳

zrangebyscore key min max


1,生产者实现
可以看到生产者很简单,其实就是利用zset的特性,给一个zset添加元素而已,而时间就是它的score。

public void produce(Integer taskId, long exeTime) {System.out.println("加入任务, taskId: " + taskId + ", exeTime: " + exeTime + ", 当前时间:" + LocalDateTime.now());RedisOps.getJedis().zadd(RedisOps.key, exeTime, String.valueOf(taskId));
}

2,消费者实现
消费者的代码也不难,就是把已经过期的zset中的元素给删除掉,然后处理数据。

public void consumer() {Executors.newSingleThreadExecutor().submit(new Runnable() {@Overridepublic void run() {while (true) {Set<String> taskIdSet = RedisOps.getJedis().zrangeByScore(RedisOps.key, 0, System.currentTimeMillis(), 0, 1);if (taskIdSet == null || taskIdSet.isEmpty()) {System.out.println("没有任务");} else {taskIdSet.forEach(id -> {long result = RedisOps.getJedis().zrem(RedisOps.key, id);if (result == 1L) {System.out.println("从延时队列中获取到任务,taskId:" + id + " , 当前时间:" + LocalDateTime.now());}});}try {TimeUnit.MILLISECONDS.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}});
}

http://www.ppmy.cn/ops/17415.html

相关文章

conda安装好了虚拟环境,可以在pycham里导入xpotato库,但是在jupyter notebook中却导入不了

问题描述 使用conda安装好了虚拟环境&#xff0c;可以在pycham里导入xpotato库&#xff0c;但是在jupyter notebook中却导入不了 原因 虽然是在anaconda Prompt的环境中进入的Jupyter Notebook&#xff0c;但是Jupyter Notebook的默认内核却不是那个环境&#xff0c;需要重新更…

【附送】macbook删除快捷键大全,一款高效的macbook删除工具 Mac实用软件推荐

几乎每一个macbook的用户在拿到电脑的第一时间&#xff0c;都会去了解macbook删除快捷键大全&#xff0c;因为这样不仅能够方便日常使用&#xff0c;提高工作效率&#xff0c;更重要的是随着使用时间的增长&#xff0c;不仅系统中会堆积许多不必要的文件&#xff0c;还会有一些…

uniapp-css:拼图(不规则图片拼插)、碎片

拼图案例样式 高斯模糊的地方可以对应的使用fliter属性和opacity来调节样式。 其余碎片和图片对应: 这段代码实现了一个拼图效果的Vue组件。以下是对代码的详细解析: 模板部分: 在模板中使用v-for指令遍历imgs数组中的每个图片对象,为每个图片创建一个元素。 使用:cla…

开发语言漫谈-Vue

Vue严格说来不是一门语言&#xff0c;它是Javascript的一个框架。如同Spring是Java语言的一个框架。只是当下为了开发效率&#xff0c;很少有人使用原生Javascript&#xff0c;多少得选择某种框架。类似的框架实在太多&#xff0c;bootstrap、layui、Angular、jQuery、react、E…

理解与解决BouncyCastle库中“ASN1Primitive overrides final method equals”异常

理解与解决BouncyCastle库中“ASN1Primitive overrides final method equals”异常 引言错误原因分析应用场景及解决方案示例示例一&#xff1a;不同版本间的兼容性问题示例二&#xff1a;库之间的相互影响示例三&#xff1a;JDK版本适配问题 结论 引言 在Java开发中&#xff0…

HarmonyOS 实战开发-MindSpore Lite引擎进行模型推理

场景介绍 MindSpore Lite 是一款 AI 引擎&#xff0c;它提供了面向不同硬件设备 AI 模型推理的功能&#xff0c;目前已经在图像分类、目标识别、人脸识别、文字识别等应用中广泛使用。 本文介绍使用 MindSpore Lite 推理引擎进行模型推理的通用开发流程。 基本概念 在进行开…

CentOS 7 上安装 MySQL 8.0详细步骤

CentOS 7 上安装 MySQL 8.0.30&#xff1a;详细步骤 准备阶段 下载 MySQL 安装包 前往 MySQL Archives&#xff0c;选择适合 CentOS 7 的安装包。 关闭防火墙和 SELinux # 临时关闭防火墙 systemctl stop firewalld.service # 永久关闭防火墙 systemctl disable firewalld.se…

如何使用bof-launcher在CC++Zig应用程序中执行Beacon对象文件(BOF)

关于bof-launcher bof-launcher是一款针对Beacon对象文件&#xff08;BOF&#xff09;的安全测试工具&#xff0c;在该工具的帮助下&#xff0c;广大研究人员可以轻松在C/C/Zig应用程序中执行Beacon对象文件&#xff08;BOF&#xff09;。 Cobalt Strike 4.1于2020年6月25日发…