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

监听redis键失效事件实现延迟功能

用Redis实现延迟队列,我研究了两种方案,发现并不简单

SpringBoot实现Redis失效监听事件—KeyExpirationEventMessageListener

Redis 监听过期的key(KeyExpirationEventMessageListener)

项目背景

需求上说,需要延迟半小时才能更新数据状态。问过架构,说项目暂不支持rocketmq。评估过kafka,可惜支持度不够,如果要实现也会相当复杂。

最终考量使用 redission ,通过监听键失效事件实现延时更新状态效果

技术落地

引入pom

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

配置类

@Configuration
public class RedisConfig {@Beanpublic RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory);return container;}@Beanpublic KeyExpirationEventMessageListener redisKeyExpirationListener(RedisMessageListenerContainer redisMessageListenerContainer){return new KeyExpirationEventMessageListener(redisMessageListenerContainer);}
}

redis,保存设置了过期时间的key

@Autowired
private RedissonClient redissonClient;public void setExpiredKey(){//添加分布式锁,避免重复设置相同keyRLock lock = redissonClient.getLock(lockKey);if (lock.tryLock(5, 5, TimeUnit.SECONDS)) {if (!redissonClient.getBucket(key).isExists()) {//业务处理redissonClient.getBucket(key).set(Constants.SHORTAGE_ORDER_BUCKET, 30, TimeUnit.MINUTES);}}
}

失效监听器listener

@Component
public class MyListener extends KeyExpirationEventMessageListener {@Overridepublic void onMessage(Message message, byte[] pattern) {//业务处理,调用相关方法对失效的key进行相关处理}
}

但注意,这里会监听所有失效的key,所以需进行相关过滤

其实就是底层原理就是 订阅-发布模式

相关文章:

监听redis键失效事件实现延迟功能

用Redis实现延迟队列&#xff0c;我研究了两种方案&#xff0c;发现并不简单 SpringBoot实现Redis失效监听事件—KeyExpirationEventMessageListener Redis 监听过期的key&#xff08;KeyExpirationEventMessageListener&#xff09; 项目背景 需求上说&#xff0c;需要延迟…...

使用UniApp实现视频数组自动下载与播放功能:一步步指导

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…...

C语言笔试面试必刷题

&#x1f38a;【面经】专题正在持续更新中&#xff0c;内含C语言&#xff0c;数据结构&#xff0c;Linux&#xff0c;网络编程等✨&#xff0c;欢迎大家前往订阅本专题&#xff0c;获取更多详细信息哦&#x1f38f;&#x1f38f;&#x1f38f; &#x1fa94;本系列专栏 - ​​…...

window11安装Python环境

python环境安装 访问Python官网:https://www.python.org/ 点击downloads按钮&#xff0c;在下拉框中选择系统类型(windows/Mac OS/Linux等) 选择下载最新版本的Python cmd命令如果出现版本号以及>>>则表示安装成功 如果出现命令行中输入python出现如下错误 可能…...

SpringBoot中的日志使用

SpringBoot的默认使用 观察SpringBoot的Maven依赖图 可以看出来&#xff0c;SpringBoot默认使用的日志系统是使用Slf4j作为门户&#xff0c;logback作为日志实现 编写一个测试代码看是否是这样 SpringBootTest class SpringbootLogDemoApplicationTests {//使用Slf4j来创建LOG…...

微信小程序中监听横屏竖屏

直接上代码 第一步&#xff1a;在你想要监听页面的json文件中添加此节点 "pageOrientation": "auto" 第二步&#xff1a;wx.onWindowResize() page&#xff08;{ onLoad() {this.kstd()},kstd(){ // 监听屏幕旋转事件 wx.onWindowResize((res)>{// …...

云原生概述

1. 何谓云原生 云原生是一种构建和运行应用程序的方法&#xff0c;是一套技术体系和方法论。云原生&#xff08;CloudNative&#xff09;是一个组合词&#xff0c;CloudNative。Cloud表示应用程序位于云中&#xff0c;而不是传统的数据中心&#xff1b;Native表示应用程序从设…...

消失的它:网络层分片包中的第一个分片包去哪了?

在网络层IP包分片的过程中&#xff0c;遇到了大麻烦&#xff01; 主机A&#xff1a; IP地址&#xff1a;192.168.0.10/24 MAC地址&#xff1a;02:00:00:00:00:10 主机B&#xff1a; IP地址&#xff1a;192.168.0.20/24 MAC地址&#xff1a;02:00:00:00:00:20 MTU&#xff1a;1…...

LeetCode刷题---有效的括号

这里用到了栈的思想 栈(stack)是限定仅在表尾进行插入或者删除的线性表。对于栈来说&#xff0c;表尾端称为栈顶&#xff08;top&#xff09;&#xff0c;表头端称为栈低&#xff08;bottom&#xff09;。不含元素的空表称为空栈。因为栈限定在表尾进行插入或者删除&#xff0c…...

QT学习笔记-QT访问各种关系数据库笔记汇总

QT学习笔记-QT访问各种关系数据库笔记汇总 1、QT访问Oracle数据库2、QT访问SQLServer数据库3、QT访问MySQL数据库4、QT访问PostgreSQL数据库5、QT访问Access数据库6、QT多线程中访问数据库的要点 在使用QT进行应用开发过程中&#xff0c;不可避免的会涉及到访问关系数据库&…...

Shell脚本-常用命令

Shell 脚本 Shell 脚本&#xff08;shell script&#xff09;&#xff0c;是一种为 shell 编写的脚本程序。 业界所说的 shell 通常都是指 shell 脚本&#xff0c;但读者朋友要知道&#xff0c;shell 和 shell script 是两个不同的概念。 由于习惯的原因&#xff0c;简洁起见&a…...

Flink之输出算子Redis Sink

Redis Sink Redis Sinkjedis实现添加依赖自定义Redis Sink使用Sink验证 开源 Redis Connector添加依赖自定义Redis SinkRedisCommandString数据类型示例Hash数据类型示例 使用SinkRedisStringSinkRedisHashSink 验证 Redis Sink 在新版Flink的文档中&#xff0c;并没有发现Redi…...

【数据结构】顺序表实现通讯录

前言 在上一节中我们实现了顺序表&#xff0c;现在我们将使用顺序表完成通讯录的实现。&#xff08;注&#xff1a;本人水平有限&#xff0c;“小屎山”有些许bug&#xff0c;代码冗余且语无伦次&#xff0c;望谅解&#xff01;&#x1f605;&#xff09; 文章目录 一、数据结构…...

JMeter 随机数生成器简介:使用 Random 和 UUID 算法

在压力测试中&#xff0c;经常需要生成随机值来模拟用户行为。JMeter 提供了多种方式来生成随机值&#xff0c;本文来具体介绍一下。 随机数函数 JMeter 提供了多个用于生成随机数的函数&#xff0c;其中最常用的是 __Random 函数。该函数可以生成一个指定范围内的随机整数或…...

vue3 更换 elemnt-ui / element-plus 版本npm命令

1. 安装 / 更换 element-ui 版本 [ 在 后面指定想要安装的版本 ] //卸载当前版本 npm uninstall element-ui //安装指定版本 npm i element-ui2.4.8 -S --legacy-peer-deps 2. 安装 / 更换 element-plus 版本 [ 在 后面指定想要安装的版本 ] npm install element-plus2.3…...

react.js 手写响应式 reactive

Redux 太繁琐&#xff0c;Mbox 很酷但我们可能没必要引入新的包&#xff0c;那就让我们亲自在 react.js 中通过代理实现一套钩子来达到类似 vue 的响应式状态&#xff1a; 实现 reactive hooks 代理类声明 代理状态的类应当提供可访问的状态&#xff0c;和订阅变化的接口。 …...

代码随想录打卡第四十六天|完全背包 ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ

完全背包理论 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题唯一…...

【BP-Adaboost预测】基于BP神经网络的Adaboost的单维时间序列预测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

Origami Studio for Mac:塑造未来,掌握原型设计之巅

在当今高度竞争的设计领域&#xff0c;原型设计的重要性不言而喻。它不仅是沟通想法&#xff0c;也是测试和改进设计的关键环节。而现在&#xff0c;一款强大的原型设计工具——Origami Studio for Mac&#xff0c;正在席卷设计界&#xff0c;以其独特的功能和卓越的性能&#…...

UML类图中各箭头表示总结

UML类图中各箭头表示总结 1、泛化2、实现3、依赖4、关联5、聚合6、组合 在UML类图中&#xff0c;箭头关系是用来表示类之间的关系的。箭头关系的种类有以下几种&#xff1a; 1、泛化 泛化&#xff1a;表示类之间的继承关系。箭头从子类指向父类。箭头&#xff1a;实线空心三角…...

Translumo终极指南:免费实时屏幕翻译工具,打破语言壁垒的完整解决方案

Translumo终极指南&#xff1a;免费实时屏幕翻译工具&#xff0c;打破语言壁垒的完整解决方案 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors…...

高精度文本分割效果对比:BERT模型在不同行业语料上的表现

高精度文本分割效果对比&#xff1a;BERT模型在不同行业语料上的表现 最近在做一个文档智能处理的项目&#xff0c;需要把各种格式的文档&#xff0c;比如合同、论文、新闻稿&#xff0c;自动切分成有逻辑的段落或章节。试了好几种方法&#xff0c;最后发现基于BERT的文本分割…...

CAD_Sketcher:Blender参数化草图设计的革命性工具

CAD_Sketcher&#xff1a;Blender参数化草图设计的革命性工具 【免费下载链接】CAD_Sketcher Constraint-based geometry sketcher for blender 项目地址: https://gitcode.com/gh_mirrors/ca/CAD_Sketcher 在Blender中进行精确几何建模时&#xff0c;你是否曾因手动调整…...

Stable Yogi Leather-Dress-Collection自动化流程:使用Python脚本批量生成商品图

Stable Yogi Leather-Dress-Collection自动化流程&#xff1a;使用Python脚本批量生成商品图 每次上新都要找设计师做几十张商品图&#xff0c;费时又费钱&#xff1f;产品图风格不统一&#xff0c;影响品牌形象&#xff1f;如果你在电商或内容创作团队&#xff0c;这些问题肯…...

LayerDivider:如何实现单张插画智能分层的终极解决方案

LayerDivider&#xff1a;如何实现单张插画智能分层的终极解决方案 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 面对复杂的数字插画作品&#xff0c;设…...

如何在Windows上实现完全本地的实时语音识别:TMSpeech完整指南

如何在Windows上实现完全本地的实时语音识别&#xff1a;TMSpeech完整指南 【免费下载链接】TMSpeech 腾讯会议摸鱼工具 项目地址: https://gitcode.com/gh_mirrors/tm/TMSpeech 你是否曾经在会议中因为忙着记录而错过了重要内容&#xff1f;或者为视频制作字幕而花费大…...

SITS2026深度拆解(全球仅7家实验室掌握的因果推理对齐协议)

第一章&#xff1a;SITS2026深度解析&#xff1a;AGI的关键技术挑战 2026奇点智能技术大会(https://ml-summit.org) SITS2026作为全球首个聚焦通用人工智能&#xff08;AGI&#xff09;系统级验证与可扩展治理的年度技术峰会&#xff0c;其核心议程《SITS2026 AGI基准协议》首…...

别再只测准确率!智能代码生成必须评估的4个隐藏可维护性指标(附IEEE Std. 2914-2024合规对照表)

第一章&#xff1a;智能代码生成代码可维护性评估的范式跃迁 2026奇点智能技术大会(https://ml-summit.org) 传统代码可维护性评估长期依赖人工审查、圈复杂度&#xff08;Cyclomatic Complexity&#xff09;或静态指标&#xff08;如注释率、函数长度&#xff09;&#xff0c…...

手把手教你写一个Windows垃圾清理批处理脚本(.bat),一键释放C盘空间

从零构建Windows深度清理大师&#xff1a;定制化批处理脚本实战指南 当C盘亮起红色预警&#xff0c;系统开始龟速运行&#xff0c;大多数人的第一反应是安装各种"一键清理"工具。但这类工具往往伴随着隐私风险、冗余功能甚至捆绑软件。其实Windows系统本身就提供了强…...

【Python基础20讲】第01章:Python 环境搭建与第一个程序

博主智算菩萨&#xff0c;专注于人工智能、Python编程、音视频处理及UI窗体程序设计等方向。致力于以通俗易懂的方式拆解前沿技术&#xff0c;从零基础入门到高阶实战&#xff0c;陪伴开发者共同成长。目前已开设五大技术专栏&#xff0c;累计发布多篇原创技术文章&#xff0c;…...