Redis 延迟队列

Redis 延迟队列

1. 什么是延迟队列

延迟队列是一种特殊的队列,允许元素在特定的延迟时间之后才被消费。在一些场景中,如任务调度、订单超时处理、消息重试等,延迟队列是非常有用的。

2. Redis 实现延迟队列的原理

Redis 提供了一些数据结构和命令,可以用来实现延迟队列。常用的方法是使用有序集合(Sorted Set)来存储任务,并使用任务的执行时间作为排序依据。通过定期扫描有序集合,找到到期的任务并执行。

3. 延迟队列的实现步骤

3.1 添加任务到延迟队列

使用有序集合(Sorted Set)存储任务。任务的执行时间作为排序依据,任务内容作为成员。

ZADD delay_queue <execution_time> <task>
  • delay_queue:延迟队列的键名。
  • execution_time:任务的执行时间,通常使用 Unix 时间戳。
  • task:任务内容,可以是任务 ID、消息等。

示例:

ZADD delay_queue 1625097600 "task1"  # 添加一个任务,执行时间为 1625097600
ZADD delay_queue 1625097700 "task2"  # 添加另一个任务,执行时间为 1625097700
3.2 处理延迟队列中的任务

通过定期扫描有序集合,找到到期的任务并执行。使用 ZRANGEBYSCORE 命令获取到期的任务,然后从集合中删除这些任务。

ZRANGEBYSCORE delay_queue -inf <current_time>
  • delay_queue:延迟队列的键名。
  • -inf:表示负无穷,获取所有小于当前时间的任务。
  • <current_time>:当前时间的 Unix 时间戳。

示例:

ZRANGEBYSCORE delay_queue -inf 1625097650  # 获取所有到期的任务

获取到期任务后,使用 ZREM 命令从集合中删除这些任务。

ZREM delay_queue "task1"
3.3 使用 Lua 脚本确保原子性

为了确保获取和删除任务的原子性,可以使用 Redis 的 Lua 脚本。以下是一个示例 Lua 脚本:

local tasks = redis.call('ZRANGEBYSCORE', KEYS[1], '-inf', ARGV[1])
if #tasks > 0 thenredis.call('ZREM', KEYS[1], unpack(tasks))
end
return tasks

执行 Lua 脚本:

EVAL <script> 1 delay_queue <current_time>
3.4 定期处理任务

使用一个定时任务来定期执行上述 Lua 脚本,处理延迟队列中的到期任务。可以使用任何编程语言的定时任务框架来实现。

要在Java中实现使用Redis作为延迟队列的功能,可以借助Jedis库与Redis交互。下面是一个完整的Java示例,包括添加任务到延迟队列和定期处理延迟队列中的任务。

4. 示例代码
4.1. 添加依赖

首先,在你的pom.xml文件中添加Jedis的依赖:

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.0.1</version>
</dependency>
4.2. Java 实现
4.2.1 添加任务到延迟队列
import redis.clients.jedis.Jedis;public class DelayQueueProducer {private static final String DELAY_QUEUE_KEY = "delay_queue";public static void main(String[] args) {try (Jedis jedis = new Jedis("localhost", 6379)) {String task = "task1";long delay = 60;  // 延迟 60 秒long executionTime = System.currentTimeMillis() / 1000 + delay;jedis.zadd(DELAY_QUEUE_KEY, executionTime, task);System.out.println("Task added: " + task);}}
}
4.2.2 处理延迟队列中的任务
import redis.clients.jedis.Jedis;public class DelayQueueConsumer {private static final String DELAY_QUEUE_KEY = "delay_queue";public static void main(String[] args) {try (Jedis jedis = new Jedis("localhost", 6379)) {while (true) {long currentTime = System.currentTimeMillis() / 1000;// 获取到期的任务Set<String> tasks = jedis.zrangeByScore(DELAY_QUEUE_KEY, 0, currentTime);if (tasks.isEmpty()) {System.out.println("No tasks to process");} else {for (String task : tasks) {// 处理任务System.out.println("Processing task: " + task);// 从延迟队列中删除任务jedis.zrem(DELAY_QUEUE_KEY, task);}}// 每秒扫描一次Thread.sleep(1000);}} catch (InterruptedException e) {e.printStackTrace();}}
}

5. 总结

通过使用 Redis 的有序集合,可以高效地实现延迟队列。关键在于利用任务的执行时间作为排序依据,并通过定期扫描来处理到期的任务。使用 Lua 脚本可以确保获取和删除任务的原子性,从而避免并发问题。

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

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

相关文章

使用el-tree 处理权限树父节点半选和子节点选中获取,及回显父节点不覆盖所以子节点处理

1 获取 父子节点 key 当前 key id 设置el-tree <el-treev-if"isShowTree"ref"treeRef2"style"max-width: 260px":data"assistantListTree"show-checkbox:default-expand-all"isExpandAll"node-key"id":chec…

收银系统源码-商城下单,门店接单

随着新零售时代的不断进步&#xff0c;线下线上一体化的收银系统&#xff0c;被很多门店越来越重视。用户在线上商城下单后&#xff0c;门店如何接单呢&#xff0c;如何处理订单呢&#xff1f; 1.收银系统开发语言 核心开发语言: PHP、HTML5、Dart后台接口: PHP7.3后合管理网…

STM32全栈嵌入式人脸识别考勤系统:融合OpenCV、Qt和SQLite的解决方案

1. 项目概述 本项目旨在设计并实现一个基于STM32的全栈人脸识别考勤系统。该系统结合了嵌入式开发、计算机视觉和数据库技术&#xff0c;实现了自动人脸检测、识别和考勤记录功能。 主要特点: 使用STM32F4系列微控制器作为主控制器采用OpenCV进行人脸检测和识别Qt开发跨平台…

c# excel转pdf

前提条件&#xff1a; 电脑安装了&#xff1a;Microsoft.Office。如没有安装&#xff0c;则不可以调用此方法。 public string ExceltoPdfs(string excelpath, string pdfpath){try{Microsoft.Office.Interop.Excel.Application app new Microsoft.Office.Interop.Excel.App…

LVS+Nginx高可用集群---keepalived原理与实战

1.高可用集群架构keepalived双机主备原理 高可用&#xff1a;(HA) 部署nginx存在两台nginx。当主节点的nginx宕机停止服务的时候&#xff0c;nginx备用机起到跟nginx(主) keepalived的概念&#xff1a;解决单点故障&#xff1b;组件免费&#xff1b;可以实现高可用HA机制&…

封装poi操作excel超实用的工具类

适用poi版本&#xff1a;5.2.2 1.行索引获取Row对象 可能sheet页对象没有创建这一行&#xff0c;可能为空&#xff0c;为空时先创建Row再返回 public static Row safeRow(Sheet sheet,int i){Row row sheet.getRow(i);if(row null){row sheet.createRow(i);}return row;} …

【音视频 | HTTP协议】HTTP协议详细介绍(HTTP方法、报文格式、报文头部字段、状态码)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

git实现多人协作开发同一个项目

Git 是一个非常流行的分布式版本控制系统&#xff0c;用于管理代码版本。在多人协作开发同一个项目时&#xff0c;Git 提供了一系列功能和工作流来帮助团队有效地协同工作。 1. 初始化 Git 仓库 首先&#xff0c;确保你的项目目录已经初始化为一个 Git 仓库。如果没有&#x…

推出全新的ZL3079x、ZL3069x、ZL3066x同步器,优化用于5G运输和无线基础设施设备

一、单通道、双通道和三通道IEEE1588/SyncE网络同步器 ZL3079x提供1个、2个和三个独立的组合硬件和软件平台定时通道&#xff0c;包括IEEE 1588-2008精确时间协议栈和同步算法。该设备使用miTimePLL定时技术&#xff0c;为5G传输和无线基础设施设备提供新的改进功能。该器件非…

正则表达式在Python中的高级应用:从HTML中提取数据

正则表达式在Python中的高级应用&#xff1a;从HTML中提取数据 作为一名资深的Python程序员&#xff0c;我深知正则表达式在文本处理中的重要性。尤其是在处理HTML文档时&#xff0c;正则表达式可以成为我们提取数据的强大工具。在本文中&#xff0c;我将通过一个实际的例子&a…

低代码前端框架Amis全面教程

什么是Amis&#xff1f; 1.1 Amis的基本概念 Amis是一个基于JSON配置的前端低代码框架&#xff0c;由百度开源。它允许开发者通过简单的JSON配置文件来生成复杂的后台管理页面&#xff0c;从而大大减少了前端开发的工作量。Amis的核心理念是通过配置而非编码来实现页面的构建…

阿里云ACP云计算高级攻城狮通用知识

&#x1f525;概述 阿里云云计算高级工程师ACP认证是面向使用阿里云云计算产品的架构、开发、运维类人员的专业技术认证&#xff0c;主要考核考生利用阿里云云计算技术服务体系设计稳定、安全、高性能、易扩展、低成本的企业云计算架构的能力。 前提&#xff1a;在写适用人群…

Spring后端框架复习总结

之前写的博客太杂,最近想把后端框架的知识点再系统的过一遍,主要是Spring Boot和Mybatis相关,带着自己的理解使用简短的话把一些问题总结一下,尤其是开发中和面试中的高频问题,基础知识点可以参考之前写java后端专栏,这篇不再赘述。 目录 Spring什么是AOP?底层原理?事务…

word的进阶

Word的基本操作 这里主要用到的软件是WPS软件。 一、创建一个文档 第一种&#xff1a;快捷键&#xff1a;ctrln第二种&#xff1a;通过界面鼠标点击 二、设置文档背景 更换过的背景如下&#xff1a; 三、章节、目录导航的设置 四、插入目录页 五、对历史文档进行管理 六、…

大数减法c++

这里写目录标题 key key 检查减数和被减数的大小&#xff0c;大的放前&#xff0c;小的放后确定结果是正数&#xff0c;还是负数&#xff0c;即符号位从低位开始减如果a[i]<b[i]&#xff0c;则向高位借1当10&#xff0c;a[i1]–;a[i]10 #include <iostream> #include…

Java_MyBatisPlus

MyBatisPlus属于是MyBatis的拓展&#xff0c;不影响原MyBatis框架下的代码运行&#xff0c;并对MyBatis框架进行拓展及优化。 使用步骤&#xff1a; 注意&#xff1a;继承BaseMapper时要填写泛型为要操作的实体类。 基本原理&#xff1a; MyBatisPlus通过扫描实体类&#xff…

【鸿蒙学习笔记】构建布局・选项卡 (Tabs)

官方文档&#xff1a;选项卡 (Tabs) 目录标题 底部导航顶部导航侧边导航限制导航栏的滑动切换固定导航栏・可滚动导航栏自定义导航栏切换至指定页签 底部导航 Entry Component struct Bujv_tabs {build() {Column() {Tabs({ barPosition: BarPosition.End }) {TabContent() {T…

怎么给PDF文件设置加密保护?有哪些方法?

pdf作为一种便携式文档&#xff0c;是展示内容的首选&#xff0c;目前也已广泛应用于交换和分享等&#xff0c;例如内部报告以及商业提案等。然而&#xff0c;在如今的数字化时代&#xff0c;随着越来越多的企业将其文档存储和在线分享&#xff0c;pdf文件也可能面临安全隐私泄…

深入理解ADB:Android调试桥详解与使用指南

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Android ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 1. 什么是ADB&#xff1f; ADB的基本原理&#xff1a; 2. ADB的安装与配置 安装ADB工具集&#xff1a; 配置ADB环境变量&am…

人大金仓数据库驱动导入maven

1.去人大金仓官网去查找合适的驱动人大金仓-成为世界卓越的数据库产品与服务提供商 2.下载解压后 执行下面的代码 mvn install:install-file -DgroupIdkingbase -DartifactIdkingbase8 -Dversion8 -DfileF:\1foryou\foryou-report\kingbase8-8.6.0.jar -Dpackagingjar -Dgene…