使用redisson 实现redis 的延迟任务

2024-09-03 02:38

本文主要是介绍使用redisson 实现redis 的延迟任务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、原理介绍

简单说下redis实现延迟队列的原理:把所有需要延时执行的任务添加到有序集合里面;并将任务的执行时间设置为分值,另外再使用另一个线程来查找有序集合里面是否存在可以被立即执行的任务,如果有的话就从有序集合里面移除那个任务,并将其添加到另一个执行队列里面。

而 Redisson 封装了接口给我们使用,我们只需要调用接口就可以直接使用,不需要关心redis具体实现原理。

2、使用

2.1 引入pom依赖

<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.13.3</version>
</dependency>

2.2 创建任务实体:

import java.io.Serializable;public class Work implements Serializable{private static final long serialVersionUID = -9157119130546758211L;// 订单IDprivate String id;// 延迟时间:秒private int times;public Work(String id, int times) {this.id = id;this.times = times;}public String getId() {return id;}public void setId(String id) {this.id = id;}public int getTimes() {return times;}public void setTimes(int times) {this.times = times;}}

2.3 创建获取任务线程,使用while不间断获取延迟队列的任务

public class TestDelayMessage {public static void main(String[] args) throws InterruptedException {Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");Redisson redisson = (Redisson) Redisson.create(config);String key = "delay_queue";RBlockingQueue<Work> blockingFairQueue = redisson.getBlockingQueue(key);RDelayedQueue<Work> delayedQueue = redisson.getDelayedQueue(blockingFairQueue);while (true) {System.out.println("等待获取任务");Work work = blockingFairQueue.take();// 应该把work扔进其他执行队列,这里直接模拟执行System.out.println("执行任务,任务ID:" + work.getId() + " 执行时间:" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("YYYY-MM-dd hh:mm:ss")));}// redisson.shutdown();}}

2.4 创建生产任务实体,将延迟任务放入到队列

import java.util.concurrent.TimeUnit;import org.redisson.Redisson;
import org.redisson.api.RBlockingQueue;
import org.redisson.api.RDelayedQueue;
import org.redisson.config.Config;public class DelayMessageProducer {static String key = "delay_queue";public static void main(String[] args) {Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");Redisson redisson = (Redisson) Redisson.create(config);Work work1 = new Work("1", 3);addQueue(redisson, work1, work1.getTimes(), TimeUnit.SECONDS);Work work2 = new Work("2", 5);addQueue(redisson, work2, work2.getTimes(), TimeUnit.SECONDS);Work work3 = new Work("3", 8);addQueue(redisson, work3, work3.getTimes(), TimeUnit.SECONDS);Work work4 = new Work("4", 10);addQueue(redisson, work4, work4.getTimes(), TimeUnit.SECONDS);System.out.println("任务放置完毕");redisson.shutdown();}public static void addQueue(Redisson redisson, Work work, long delay, TimeUnit timeUnit) {RBlockingQueue<Work> blockingFairQueue = redisson.getBlockingQueue(key);RDelayedQueue<Work> delayQueue = redisson.getDelayedQueue(blockingFairQueue);delayQueue.offer(work, delay, timeUnit);delayQueue.destroy();}}

3.测试

首先启动获取任务队列,等待任务下达:

再启动下发任务线程:

最后切回接受任务console查看任务执行状态:

这篇关于使用redisson 实现redis 的延迟任务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1131792

相关文章

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

Nexus安装和启动的实现教程

《Nexus安装和启动的实现教程》:本文主要介绍Nexus安装和启动的实现教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Nexus下载二、Nexus安装和启动三、关闭Nexus总结一、Nexus下载官方下载链接:DownloadWindows系统根

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

Springboot整合Redis主从实践

《Springboot整合Redis主从实践》:本文主要介绍Springboot整合Redis主从的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言原配置现配置测试LettuceConnectionFactory.setShareNativeConnect

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

MySQL 衍生表(Derived Tables)的使用

《MySQL衍生表(DerivedTables)的使用》本文主要介绍了MySQL衍生表(DerivedTables)的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学... 目录一、衍生表简介1.1 衍生表基本用法1.2 自定义列名1.3 衍生表的局限在SQL的查询语句select