Spring Boot 监听 Redis Key 失效事件实现定时任务
阅读本文大概需要 2.8 分钟。
来自:https://antoniopeng.com/
业务场景
实现思路
开启 Redis key 过期提醒
K
:keyspace 事件,事件以 keyspace@ 为前缀进行发布E
:keyevent 事件,事件以 keyevent@ 为前缀进行发布g
:一般性的,非特定类型的命令,比如del,expire,rename等$
:字符串特定命令l
:列表特定命令s
:集合特定命令h
:哈希特定命令z
:有序集合特定命令x
:过期事件,当某个键过期并删除时会产生该事件e
:驱逐事件,当某个键因 maxmemore 策略而被删除时,产生该事件A
:g$lshzxe的别名,因此”AKE”意味着所有事件
引入依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
dependency>
相关配置
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 {
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
}
}
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
*/
@Override
public void onMessage(Message message, byte[] pattern) {
// 获取到失效的 key,进行取消订单业务处理
String expiredKey = message.toString();
System.out.println(expiredKey);
}
}
推荐阅读:
SpringBoot 整合oauth2实现授权第三方应用(实战版)
内容包含Java基础、JavaWeb、MySQL性能优化、JVM、锁、百万并发、消息队列、高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper、数据结构、限流熔断降级......等技术栈!
⬇戳阅读原文领取! 朕已阅
评论