点击上方“方志朋”,选择“设为星标”

回复”666“获取新整理的面试文章

作者:彭超

https://antoniopeng.com

业务场景

我们以订单功能为例说明下:

生成订单后一段时间不支付订单会自动关闭。最简单的想法是设置定时任务轮询,但是每个订单的创建时间不一样,定时任务的规则无法设定,如果将定时任务执行的间隔设置的过短,太影响效率。

还有一种想法,在用户进入订单界面的时候,判断时间执行相关操作。方式可能有很多,在这里介绍一种监听 Redis 键值对过期时间来实现订单自动关闭。

实现思路

在生成订单时,向 Redis 中增加一个 KV 键值对,K 为订单号,保证通过 K 能定位到数据库中的某个订单即可,V 可为任意值。

假设,生成订单时向 Redis 中存放 K 为订单号,V 也为订单号的键值对,并设置过期时间为 30 分钟,如果该键值对在 30 分钟过期后能够发送给程序一个通知,或者执行一个方法,那么即可解决订单关闭问题。

实现:通过监听 Redis 提供的过期队列来实现,监听过期队列后,如果 Redis 中某一个 KV 键值对过期了,那么将向监听者发送消息,监听者可以获取到该键值对的 K,注意,是获取不到 V 的,因为已经过期了,这就是上面所提到的,为什么要保证能通过 K 来定位到订单,而 V 为任意值即可。拿到 K 后,通过 K 定位订单,并判断其状态,如果是未支付,更新为关闭,或者取消状态即可。

开启 Redis key 过期提醒

修改 redis 相关事件配置。找到 redis 配置文件 redis.conf,查看 notify-keyspace-events 配置项,如果没有,添加 notify-keyspace-events Ex,如果有值,则追加 Ex,相关参数说明如下:

  • K:keyspace 事件,事件以 keyspace@ 为前缀进行发布

  • E:keyevent 事件,事件以 keyevent@ 为前缀进行发布

  • g:一般性的,非特定类型的命令,比如del,expire,rename等

  • $:字符串特定命令

  • l:列表特定命令

  • s:集合特定命令

  • h:哈希特定命令

  • z:有序集合特定命令

  • x:过期事件,当某个键过期并删除时会产生该事件

  • e:驱逐事件,当某个键因 maxmemore 策略而被删除时,产生该事件

  • A:g$lshzxe的别名,因此”AKE”意味着所有事件

引入依赖

在 pom.xml 中添加 org.springframework.boot:spring-boot-starter-data-redis 依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

相关配置

定义配置 RedisListenerConfig 实现监听 Redis key 过期时间

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;@Configuration
public class RedisListenerConfig {@BeanRedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory);return container;}
}

定义监听器 RedisKeyExpirationListener,实现KeyExpirationEventMessageListener 接口,查看源码发现,该接口监听所有 db 的过期事件 keyevent@*:expired"

import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;/*** 监听所有db的过期事件__keyevent@*__:expired"*/
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {super(listenerContainer);}/*** 针对 redis 数据失效事件,进行数据处理* @param message* @param pattern*/@Overridepublic void onMessage(Message message, byte[] pattern) {// 获取到失效的 key,进行取消订单业务处理String expiredKey = message.toString();System.out.println(expiredKey);}
}
热门内容:老大批评我不要为了“分库分表”而“分库分表”
真能一快遮"百丑"?为什么要弃坑 FastJson
面试再被问到 ConcurrentHashMap,把这篇文章甩给他!
干掉 try catch !
“���”引发的线上事故
有了这款可视化工具,Java 应用性能调优 so easy。。。最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・

Spring Boot 监听 Redis Key 失效事件实现定时任务相关推荐

  1. redis 能不能监听特定的key失效_Spring boot实现监听Redis key失效事件实现和其它方式...

    1.pom 中添加依赖 org.springframework.boot spring-boot-starter-data-redis 2.定义配置RedisListenerConfig /** * ...

  2. redis 能不能监听特定的key失效_php监听redis key失效触发回调事件

    订单超时.活动过期解决方案:php监听redis key失效触发回调事件 Redis 的 2.8.0 版本之后可用,键空间消息(Redis Keyspace Notifications),配合 2.0 ...

  3. php 监听redis,php监听redis key失效触发回调事件_后端开发

    php中使用fsockopen实现异步请求(代码示例)_后端开发 php执行一段程序,有可能几毫秒就执行完毕,也有可能耗时较长.例如,用户下单这个事件,如果调用了些第三方服务进行发邮件.短信.推送等通 ...

  4. php 监听redis,php监听redis key失效触发回调事件

    订单超时.活动过期解决方案:php监听redis key失效触发回调事件 Redis 的 2.8.0 版本之后可用,键空间消息(Redis Keyspace Notifications),配合 2.0 ...

  5. SpringBoot监听redis Key变化事件详解

    键空间通知(keyspace notification) 一 .功能概览 键空间通知使得客户端可以通过订阅频道或模式, 来接收那些以某种方式改动了 Redis key变化的事件. 所有修改key键的命 ...

  6. 多服务监听Redis key失效通知,并指定特定机器进行处理业务

    #1.修改 redis.conf 配置 找到notify-keyspace-events 并将notify-keyspace-events 修改为 notify-keyspace-events Ex ...

  7. springboot listener_Springboot 监听redis key的过期事件

    项目中常常会碰到这样的需求,用户下订单后,30分钟未完成自动取消订单的功能. 有人说这个简单呀,写个定时任务就搞定了.除了定时任务之外,难道就没有其他的方法来实现吗?有--Redis 的键空间通知事件 ...

  8. Spring Boot监听事件同步和异步使用

    废话前言: 代码环境:WIN7+IDEA+JAD1.8+Spring Boot 2.0 首先说一下我为什么使用事件,比如现在创建一个订单但是我创建成功后要给客户发送一条短信和一个邮件提醒,本身没创建订 ...

  9. 监听Redis Key事件

    文章目录 1.使用场景 2.使用 开启 redis 的事件监听与发布 Springboot集成 1.使用场景 处理订单过期自动取消,比如下单30分钟未支付自动更改订单状态. 注意:只能适用于单机red ...

最新文章

  1. 【Go】Go基础(七):包
  2. SQL Server 2008还原数据库时出现“备份集中的数据库备份与现有的数据库不同”的解决方法...
  3. AngularJs快速上手掌握
  4. h5 socket.io java,从HTML5 WebSocket到Socket.io
  5. 【Android基础】Android Toast显示消息的几种方法
  6. 如何在 ASP.Net Core 中使用 File Providers
  7. python中class_【机器学习基础】数学推导+纯Python实现机器学习算法11:朴素贝叶斯...
  8. mysql heartbeat keepalived_LVS+keepalived+DRBD+heartbeat+mysql
  9. Silverlight 数据绑定(Binding)
  10. “同样的”约束,不同的位置
  11. 11.17牛客练习赛31 ABC-----未完
  12. 同一个按钮,实现排序
  13. html5酷狗音乐网页代码,酷狗音乐
  14. ORBSLAM3 VIO初始化
  15. 神经网络——基础思想
  16. 计算机自带游戏怎么调,电脑游戏声音小怎么调,教您电脑游戏声音小怎么调
  17. 哪些服务器适合使用固态硬盘,服务器用固态硬盘还是机械硬盘合适?
  18. (ONENET+阿里云+datav+node+js+MYSQL+STM32)基于ONENET的大数据可视化平台搭建
  19. 现代大学英语精读第二版(第六册)学习笔记(原文及全文翻译)——3 - What Is News?(新闻是什么?)
  20. Reflector 引起VS2013无法调试(Debug)并异常关闭

热门文章

  1. IOS 编程中引用第三方的方类库的方法及常见问题
  2. Vue 环境搭建(win10)
  3. 软件工程实践第一次作业
  4. 使用C#的HttpWebRequest模拟登陆网站
  5. ACM学习历程—HDU5586 Sum(动态规划)(BestCoder Round #64 (div.2) 1002)
  6. sqlserver 与 mysql 联合更新两个表 区别
  7. 【青少年编程(第27周)】报名考级的小朋友注意截止时间!
  8. 谢文睿:西瓜书 + 南瓜书 吃瓜系列 6. 神经网络
  9. 如何通过代码连接SQL Server数据库
  10. 【PAT (Basic Level) 】1014 福尔摩斯的约会 (20 分)