实现对redis过期键监听案例

server/2024/10/23 20:17:00/

开发背景

 为了实现当经纪人A提交分佣后如果三天后其他经纪人没有确认分佣就自动确认分佣,如果经纪人A修改分佣后再次提交分佣,时间重置为三天

实现方式

第一步:引入依赖

<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.6.0</version>
</dependency>

第二步: 配置发送过期事件的通知

redis.config文件中设置   notify-keyspace-events Ex

 第二步:创建一个jedis工具类

java">@Component
public class JedisUtil {@Value("${spring.redis.host}")private String host;@Value("${spring.redis.port}")private Integer port;@Value("${spring.redis.password}")private String password;private JedisPool jedisPool;@PostConstructpublic void init() {JedisPoolConfig poolConfig = new JedisPoolConfig();jedisPool = new JedisPool(poolConfig, host, port, 2000, password);}public Jedis getJedis() {return jedisPool.getResource();}@PreDestroypublic void close() {if (jedisPool != null) {jedisPool.close();}}
}

第三步:发布订阅

本地代码

java">    public static void main(String[] args) {Jedis jedis = new Jedis("127.0.0.1", 6379);//有密码就设置jedis.auth("aaaaa");CommissionInfoListener listener = new CommissionInfoListener();String expirationSubscription = "__keyevent@0__:expired";new Thread(() -> {try {jedis.psubscribe(listener, expirationSubscription);} catch (Exception e) {System.out.println("Subscribing failed." + e.getMessage());}}).start();}

springBoot正式项目

java">@Component
@Slf4j
public class CommissionInfoLineRunner implements CommandLineRunner {@Resourceprivate JedisUtil jedisUtil;@Overridepublic void run(String... args) throws Exception {log.info("订阅分佣三天自动确认开始~~~");Jedis jedis = jedisUtil.getJedis();CommissionInfoListener listener = new CommissionInfoListener();String expirationSubscription = "__keyevent@0__:expired";new Thread(() -> {try {jedis.psubscribe(listener, expirationSubscription);} catch (Exception e) {log.info("订阅失败,错误信息:{}", e.getMessage());}}).start();}
}

 代码解释

1.__keyevent@0__:expired含义

键空间通知会发送两种不同类型的事件消息:keyspace 和 keyevent

keyspace :键空间通知

keyevent :键事件通知

0:指的是库名称,一般默认为0

2. psubscribe

在使用 Jedis 的 psubscribe 方法时,遇到程序卡住不执行的情况是因为 psubscribe 是一个阻塞操作,它会持续监听指定模式的消息直到被外部显式地取消订阅。这是 Redis 发布订阅模式的常见行为。它设计为一直运行,直到接收到取消订阅的命令。所以在本地运行main方法后要保持运行状态,不然订阅不到消息。springboot项目中可以实现CommandLineRunner实现

第四步:监听订阅消息

代码

java">@Service
@Slf4j
public class CommissionInfoListener extends JedisPubSub {@ResourceCommissionInfoService commissionInfoService;@Overridepublic void onPMessage(String pattern, String channel, String message) {if (message.contains("aimeng:commissionInfo:confirmation:")) {Long commissionInfoId = Long.parseLong(StrUtil.subAfter(message, ':', true));log.info("分佣账单三天后自动确认开始,分佣id为:"+commissionInfoId);
//            commissionInfoService.ok(CollUtil.newArrayList(commissionInfoId));}}}

解释

1.参数message

参数message是当前监听到的key(键)

 第五步:逻辑代码

java">jedisUtil.getJedis().setex(COMMISSIONINFO_CONFIRMATION_KEY + id, EXPIRETIME, "commissionInfo");


http://www.ppmy.cn/server/134248.html

相关文章

【云原生网关】Higress 从部署到使用详解

目录 二、网关概述 2.1 什么是云原生网关 2.2 常见的云原生网关 2.2.1 Nginx 2.2.2 ApiSix 2.2.3 Kong 2.2.4 Apache Shenyu 2.2.5 Higress 2.2.6 Envoy​​​​​​​ 三、higress介绍 3.1 什么是higress 3.2 Higress 定位 3.3 Higress 内核选择 四、Higress搭…

QT--Qlabel学习、获取文本和设置文本、文本对齐方式、文本换行、显示图片

QLabel 是 Qt 中的标签类&#xff0c;通常用于显示提示性的文本&#xff0c;也可以显示图像 对齐方式 用于设置标签中的内容在水平和垂直两个方向上的对齐方式&#xff0c;比如左对齐、右对齐、上对齐、下对齐、水平居中、垂直居中等。 // 获取和设置文本的对齐方式 Qt::Ali…

计算机组成原理一句话

文章目录 计算机系统概述存储系统指令系统 计算机系统概述 指令和数据以同等地位存储在存储器中&#xff0c;形式上没有差别&#xff0c;但计算机应能区分他们。通过指令周期的不同阶段。 完整的计算机系统包括&#xff0c;1&#xff09;软件系统&#xff1a;程序、文档和数据&…

计算机专业大学四年的学习路线(非常详细),零基础入门到精通,看这一篇就够了

前言 许多学子选择踏上计算机这条充满挑战与机遇的道路。但在大学四年中&#xff0c;如何规划自己的学习路线&#xff0c;才能在毕业时脱颖而出&#xff0c;成为行业的佼佼者呢&#xff1f; 第一学年&#xff1a;基础知识的奠基 1.1 课程安排 在大学的第一年&#xff0c;重…

写 R 包教程

R R 包开发 | 保姆级教程-CSDN博客 https://www.prestevez.com/post/r-package-tutorial/ 1、加载开发所需 R 包 library(usethis) library(devtools) library(roxygen2) 2、在当前工作路径创建 R 包 usethis::create_package("myRpkg") # 在当前路径创建 my…

网易面试:请设计一个高可用性的软件架构,说明设计思路

有一位粉丝留言说&#xff0c;他前几年面试网易的研发时&#xff0c;面试官问到这样一个问题&#xff1a;**你怎么设计一个高可用性的架构&#xff1f;**当时这位粉丝列举了集群、数据库主从等方面&#xff0c;但是没有说全&#xff0c;面试结果不理想。应这位粉丝的要求&#…

TCP 全连接队列与 tcpdump 抓包

TCP 相关实验 理解 listen 的第二个参数 基于刚才封装的 TcpSocket 实现以下测试代码对于服务器, listen 的第二个参数设置为 1, 并且不调用 accept test_server.cc C #include "tcp_socket.hpp" int main(int argc, char* argv[]) {if (argc ! 3) {printf("…

`RunUMAP` 函数在 Seurat 中可以使用不同的数据进行计算

RunUMAP 函数在 Seurat 中可以使用不同的数据进行计算&#xff0c;具体取决于您传递给它的参数。即使没有显式地运行 FindNeighbors&#xff0c;RunUMAP 仍然可以计算 UMAP&#xff0c;因为它会自动构建邻居图&#xff08;neighbor graph&#xff09;。以下是详细解释&#xff…