当前位置: 首页 > news >正文

Redis+定式任务实现简易版消息队列

Redis是一个开源的内存中数据结构存储系统,通常被用作数据库、缓存和消息中间件。
Redis主要将数据存储在内存中,因此读写速度非常快。
支持不同的持久化方式,可以将内存中的数据定期写入磁盘,保证数据持久性。
redis本身就有自己的发布与订阅功能,实现简单的消息队列系统。

这里是另一种方式实现消息队列的机制,使用定式任务。
代码实现:
1、启动类开启定是任务

@SpringBootApplication
@EnableScheduling //启动类开启定时任务
public class AccountApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(AccountApplication.class, args);}
}

2、准备redis缓存工具类
 

/*** Redis的配置类*/
@Configuration
public class RedisConfiguration {private static final Logger logger = LoggerFactory.getLogger(RedisConfiguration.class);public RedisConfiguration() {logger.info("创建缓存配置类:RedisConfiguration");}@Beanpublic RedisTemplate<String, Serializable> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);redisTemplate.setKeySerializer(RedisSerializer.string());redisTemplate.setValueSerializer(RedisSerializer.json());return redisTemplate;}
}/*** Redis的缓存接口*/
public interface CacheInterface {//往队列中存入数据void saveDate(Integer i, LinkedHashMap<String, Object> map);//从队列中取数据LinkedHashMap<String, Object> getDate(Integer i);//清除队列中的数据void deleteDate(Integer i);//检查队列中剩余的数据Set<String> checkDataKey();
}/*** Redis的缓存接口的实现类*/
@Repository
public class CacheRepositoryImpl implements CacheInterface {private static final Logger logger = LoggerFactory.getLogger(CacheRepositoryImpl.class);@Autowiredprivate RedisTemplate<String, Serializable> redisTemplate;@Overridepublic void saveDate(Integer i, LinkedHashMap<String, Object> map) {String key = YOU_KEY + i;ValueOperations<String, Serializable> opsForValue = redisTemplate.opsForValue();opsForValue.set(key, map);}@Overridepublic LinkedHashMap<String, Object> getDate(Integer i) {String key = YOU_KEY + i;ValueOperations<String, Serializable> opsForValue = redisTemplate.opsForValue();Serializable serializable = opsForValue.get(key);if(serializable == null ){return null;}return (LinkedHashMap<String, Object>) serializable;}@Overridepublic void deleteDate(Integer i) {String key = YOU_KEY + i;redisTemplate.delete(key);}@Overridepublic Set<String> checkDataKey() {Set<String> keys = redisTemplate.keys(YOU_KEY  + "*");return keys;}
}

3、准备指针工具类与存取方法

    
public class TaskCount {public static Integer save = 0;public static Integer get = 0;
}@Service
public class ServiceImpl implements Service {@Autowiredprivate CacheInterface cacheImpl;//存入队列@Overridepublic JsonResult saveDate(LinkedHashMap<String, Object> map ) {cacheImpl.saveDate(TaskCount.save,map);TaskCount.save++;return JsonResult.ok();}//处理数据@Overridepublic JsonResult handleDate(LinkedHashMap<String, Object> map ) {//处理逻辑}
}

4、定式任务工具类充当消息的发布

@Component
public class TaskUtil implements CommandLineRunner {@Autowiredprivate CacheInterface cacheImpl;@Autowiredprivate Service serviceImpl;//定时任务处理,每5000毫秒@Scheduled(fixedRate = 5000)public void handleData(){LinkedHashMap<String, Object> map = cacheImpl.getDate(TaskCount.get);if(map != null){try {serviceImpl.handleData(map);cacheImpl.deleteDate(TaskCount.get);TaskCount.get++;}catch (Exception e){System.out.println(e.getMessage());}}}//每小时启动一次@Scheduled(fixedRate = 3600000)public void handleData(){handleCount(cacheImpl);}//开机加载启动@Overridepublic void run(String... args) {handleCount(cacheImpl);}}//归置双指针public static void handleCount(CacheInterface cacheImpl){try {Set<String> keys = cacheImpl.checkDataKey();int max = 0;int min = Integer.MAX_VALUE;for (String key : keys) {String[] split = key.split(":");int a = Integer.parseInt(split[split.length-1]);if(a>max){max = a;}if(a<min){min = a;}}if(max > 0 ){max = max+1;}else {min = 0;}TaskCount.get = min;TaskCount.save = max;}catch (Exception e){System.out.println(e.getMessage());}}
}

相关文章:

Redis+定式任务实现简易版消息队列

Redis是一个开源的内存中数据结构存储系统&#xff0c;通常被用作数据库、缓存和消息中间件。 Redis主要将数据存储在内存中&#xff0c;因此读写速度非常快。 支持不同的持久化方式&#xff0c;可以将内存中的数据定期写入磁盘&#xff0c;保证数据持久性。 redis本身就有自己…...

学习在 C# 中使用 Lambda 运算符

在 C# 中&#xff0c;lambda 运算符 > 同时用于 lambda 表达式和表达式体成员。 1. Lambda 表达式 Lambda 表达式是一种简洁的表示匿名方法&#xff08;没有名称的方法&#xff09;的方法。它使用 lambda 运算符 >&#xff0c;可以读作“转到”。运算符的左侧指定输入参…...

数据结构和算法,单链表的实现(kotlin版)

文章目录 数据结构和算法&#xff0c;单链表的实现(kotlin版)b站视频链接1.定义接口&#xff0c;我们需要实现的方法2.定义节点&#xff0c;表示每个链表节点。3.push(e: E)&#xff0c;链表尾部新增一个节点4.size(): Int&#xff0c;返回链表的长度5.getValue(index: Int): E…...

Jdk17是否有可能代替 Jdk8

JDK发展历史和开源 2006年SUN公司开源JDK&#xff0c;成立OpenJDK组织。2009年Oracle收购SUN&#xff0c;加快JDK发布周期。Oracle JDK与OpenJDK功能基本一致&#xff0c;但Oracle JDK提供更长时间的更新支持。 JDK版本特性 JDK11是长期支持版本&#xff08;LTS&#xff09;…...

oca和 ocp有什么区别

OCA&#xff08;Oracle Certified Associate&#xff09;和OCP&#xff08;Oracle Certified Professional&#xff09;在Oracle的认证体系中是两种不同级别的认证&#xff0c;它们之间存在明显的区别。以下是对两者区别的详细解释&#xff1a; 认证级别&#xff1a; OCA&…...

煤矿安全大模型:微调internlm2模型实现针对煤矿事故和煤矿安全知识的智能问答

煤矿安全大模型————矿途智护者 使用煤矿历史事故案例,事故处理报告、安全规程规章制度、技术文档、煤矿从业人员入职考试题库等数据,微调internlm2模型实现针对煤矿事故和煤矿安全知识的智能问答。 本项目简介: 近年来,国家对煤矿安全生产的重视程度不断提升。为了确…...

C++中的C++中的虚析构函数的作用和重要性

在C中&#xff0c;虚析构函数&#xff08;virtual destructor&#xff09;的作用和重要性主要体现在多态和继承的上下文中。了解这一点之前&#xff0c;我们先简要回顾一下多态和继承的基本概念。 继承与多态 继承&#xff1a;允许我们定义一个基类&#xff08;也称为父类或超…...

机器学习 - 文本特征处理之 TF 和 IDF

TF&#xff08;Term Frequency&#xff0c;词频&#xff09;和IDF&#xff08;Inverse Document Frequency&#xff0c;逆文档频率&#xff09;是文本处理和信息检索中的两个重要概念&#xff0c;常用于计算一个词在文档中的重要性。下面是详细解释&#xff1a; TF&#xff08…...

因为自己淋过雨所以想给嵌入式撑把伞

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;新手学嵌入式&#xff0c;…...

《C++20设计模式》中单例模式

文章目录 一、前言二、饿汉式1、实现 三、懒汉式1、实现 四、最后 一、前言 单例模式定义&#xff1a; 单例模式&#xff08;Singleton Pattern&#xff09;是一种创建型设计模式&#xff0c;其主要目的是确保一个类只有一个实例&#xff0c;并提供全局访问点来访问这个实例。…...

前端技术(说明篇)

Introduction ##编写内容&#xff1a;1.前端概念梳理 2.前端技术种类 3.前端学习方式 ##编写人&#xff1a;贾雯爽 ##最后更新时间&#xff1a;2024/07/01 Overview 最近在广州粤嵌进行实习&#xff0c;项目名称是”基于Node实现多人聊天室“&#xff0c;主要内容是对前端界…...

带电池监控功能的恒流直流负载组

EAK的交流和直流工业电池负载组测试仪对于测试和验证关键电力系统的能力至关重要&#xff0c;旨在实现最佳精度。作为一家客户至上的公司&#xff0c;我们继续尽我们所能应对供应链挑战&#xff0c;以提供出色的交货时间&#xff0c;大约是行业其他公司的一半。 交流负载组 我…...

关于Disruptor监听策略

Disruptor框架提供了多种等待策略&#xff0c;每种策略都有其适用的场景和特点。以下是这些策略的详细介绍及其适用场景&#xff1a; 1. BlockingWaitStrategy 特点&#xff1a; 使用锁和条件变量进行线程间通信&#xff0c;线程在等待时会进入阻塞状态&#xff0c;释放CPU资…...

大数据面试题之HBase(3)

HBase的预分区 HBase的热点问题 HBase的memstore冲刷条件 HBase的MVCC HBase的大合并与小合并&#xff0c;大合并是如何做的?为什么要大合并 既然HBase底层数据是存储在HDFS上&#xff0c;为什么不直接使用HDFS&#xff0c;而还要用HBase HBase和Phoenix的区别 HBase支…...

c#中赋值、浅拷贝和深拷贝

在 C# 编程中&#xff0c;深拷贝&#xff08;Deep Copy&#xff09;和浅拷贝&#xff08;Shallow Copy&#xff09;是用于复制对象的两种不同方式&#xff0c;它们在处理对象时有着重要的区别和适用场景。 浅拷贝&#xff08;Shallow Copy&#xff09; 浅拷贝是指创建一个新对…...

旧版st7789屏幕模块 没有CS引脚的天坑 已解决!!!

今天解决了天坑一个&#xff0c;大家可能有的人买的是st7789屏幕模块&#xff0c;240x240&#xff0c;1.3寸的 他标注的是老版&#xff0c;没有CS引脚&#xff0c;小崽子长这样&#xff1a; 这熊孩子用很多通用的驱动不吃&#xff0c;死活不显示&#xff0c;网上猛搜&#xff…...

激光粒度分析仪校准步骤详解:提升测量精度的秘诀

在材料科学、环境监测、医药研发等众多领域&#xff0c;激光粒度分析仪以其高精度、高效率的测量性能&#xff0c;成为了不可或缺的测试工具。然而&#xff0c;为了保持其测量结果的准确性和可靠性&#xff0c;定期校准是不可或缺的步骤。 接下来&#xff0c;佰德将为您详细介…...

独一无二的设计模式——单例模式(python实现)

1. 引言 大家好&#xff0c;今天我们来聊聊设计模式中的“独一无二”——单例模式。想象一下&#xff0c;我们在开发一个复杂的软件系统&#xff0c;需要一个全局唯一的配置管理器&#xff0c;或者一个统一的日志记录器&#xff1b;如果每次使用这些功能都要创建新的实例&…...

第二证券:可转债基础知识?想玩可转债一定要搞懂的交易规则!

可转债&#xff0c;全称是“可转化公司债券”&#xff0c;是上市公司为了融资&#xff0c;向社会公众所发行的一种债券&#xff0c;具有股票和债券的双重特点&#xff0c;投资者可以选择按照发行时约定的价格将债券转化成公司一般股票&#xff0c;也可作为债券持有到期后收取本…...

原型模式的实现

1. 引言 1.1 背景 在实际编程中,有时需要频繁创建多个相似但稍有不同的对象。如果采用传统的对象创建方式,容易造成代码冗余,对象重复初始化操作也可能带来大量的的资源消耗(如时间、内存等)。这样不仅降低了灵活性,导致难以适应状态的变化,还降低了代码的可扩展性。 …...

016、Git版本控制与协作开发流程

016 Git版本控制与协作开发流程 一个让我熬夜到凌晨三点的.gitignore 去年做一款基于STM32U5的TinyML手势识别项目,团队四个人,代码库从第一天就开始膨胀。第三天晚上,我习惯性git push,然后去睡觉。凌晨三点被手机震醒——同事在群里@我:“你push了个啥?编译不过了。”…...

会话管理封装实践:构建安全可扩展的分布式会话系统

1. 项目概述&#xff1a;一个被低估的会话管理利器如果你是一名开发者&#xff0c;尤其是经常需要处理用户登录、权限校验、状态保持这类“脏活累活”的后端或全栈开发者&#xff0c;那么你一定对“会话管理”这四个字又爱又恨。爱的是&#xff0c;它是构建安全、有状态应用的基…...

Agent Framework 中的 Workflow Composition

在前面的文章中&#xff0c;我们已经介绍了 Agent Framework 中如何定义流程节点&#xff0c;以及 Workflow 的流式执行事件。 如果你对这些概念还不太熟悉&#xff0c;可以先回顾上一篇文章&#xff1a; Agent Framework 定义流程节点以及节点的流式输出 这一节我们来介绍 Wor…...

构建高质量Awesome教程库:从Claude Code实战到开发者知识体系搭建

1. 项目概述&#xff1a;一个为Claude Code打造的开发者知识库 最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“awesome-claudcode-tutorial”。光看名字&#xff0c;你可能会有点懵——“Claude Code”是什么&#xff1f;这其实是一个由开发者社区推动的、围绕特定AI编…...

苍穹外卖day11

概述项目步入尾声&#xff0c;进行商家数据统计开发分为营业额统计&#xff0c;用户统计&#xff0c;订单统计&#xff0c;销量排名 导航栏的内容为查询选定时间内的的数据统计 右上角的数据导出为下一天的内容 数据导出后形成的图表由Apache的Echarts生成&#xff0c;是开发中…...

深度学习表示学习:特征学习与迁移学习

深度学习表示学习&#xff1a;特征学习与迁移学习 1. 技术分析 1.1 表示学习概述 表示学习是自动学习数据特征的过程&#xff1a; 表示学习层次原始数据 → 低级特征 → 中级特征 → 高级特征 → 任务预测关键:层次特征提取端到端学习迁移能力1.2 表示学习方法 方法特点监督程度…...

RK3288嵌入式开发实战:硬件架构、软件定制与典型应用场景解析

1. 项目概述&#xff1a;为什么RK3288至今仍是嵌入式开发的“硬通货”&#xff1f; 在嵌入式开发这个行当里&#xff0c;选型是个技术活&#xff0c;更是个经验活。你既要考虑当下的性能需求&#xff0c;又要掂量未来的扩展可能&#xff0c;还得平衡成本、功耗和开发周期。从业…...

别再只怪USB线了!i.MX6Q用Mfgtools烧录rootfs.tar.bz2报错的深层硬件排查指南

i.MX6Q烧录故障的硬件级诊断&#xff1a;从USB OTG冲突到电源完整性排查 当Mfgtools在rootfs.tar.bz2传输阶段突然报错"Push error"或"No Device Connected"时&#xff0c;多数开发者会本能地检查USB线缆或驱动配置。但真正棘手的故障往往潜伏在硬件交互层…...

3步掌握ADB驱动安装:Windows平台最简Android连接方案

3步掌握ADB驱动安装&#xff1a;Windows平台最简Android连接方案 【免费下载链接】Latest-adb-fastboot-installer-for-windows A Simple Android Driver installer tool for windows (Always installs the latest version) 项目地址: https://gitcode.com/gh_mirrors/la/Lat…...

SMAPI模组加载器:星露谷物语模组玩家的终极完整指南

SMAPI模组加载器&#xff1a;星露谷物语模组玩家的终极完整指南 【免费下载链接】SMAPI The modding API for Stardew Valley. 项目地址: https://gitcode.com/gh_mirrors/smap/SMAPI 你是否厌倦了手动安装星露谷物语模组时的繁琐步骤&#xff1f;是否担心模组冲突导致游…...