参考博客地址: https://blog.csdn.net/jiangxiulilinux/article/details/106555799
https://www.cnblogs.com/NJM-F/p/10442198.html
SpringBoot 监听 redis key 失效事件
需求处理订单自动取消,比如下单 24 小时未支付修改订单状态。数据自动确认, 七天自动修改数据状态(客户没有修改状态就自动修改)。
解决方案1:可以利用 redis 的 key 自动过期机制, 数据创建时 将 数据标识(需要保证唯一) 写入redis,过期时间设置 七天(按需求来定), 七天后检查数据状态,如果是初始状态,则进行处理。
开启redis key 过期提醒修改 redis 相关时间配置,找到 redis 配置文件 redis.conf, 查看 notify-keyspace-events
的 配置项,如果没有,添加 notify-keyspace-events EA
, 如果有值 添加 EA,相关参数说明如下:
K|键空间通知,所有通知以__keyspace@__ 为前缀
E|键事件通知,所有通知以 __keyevent@__ 为前缀
g|DEL 、 EXPIRE 、 RENAME 等类型无关的通用命令的通知
$|字符串命令的通知
l|列表命令的通知
s|集合命令的通知
h|哈希命令的通知
z|有序集合命令的通知
x|过期事件,每当有过期键被删除时发送
e|驱逐事件,每当有键因为 maxmemory 政策而被删除时发送
A|参数 g$lshzxe 的别名
pom 需要增加的依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
dependency>
在 springboot 中 使用
定义配置 RedisListenerConfig
@Configuration
public class RedisListenerConfig {
@Autowired
private RedisTemplate redisTemplate;
/**
* 处理乱码
* @return
*/
@Bean
public RedisTemplate redisTemplateInit() {
// key序列化
redisTemplate.setKeySerializer(new StringRedisSerializer());
//val实例化
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
}
}
定义监听器, 实现 KeyExpirationEventMessageListener 接口
这里必须要判断 redis key的 前缀,redis里面有其他key 失效也会发通知到这里来
@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) {
// 用户做自己的业务处理即可,注意message.toString()可以获取失效的key
String expiredKey = message.toString();
if(expiredKey.startsWith("orderNo:")){
//如果是order:开头的key,进行处理
System.out.println(expiredKey);
String substring = expiredKey.substring(8); //去掉orderNo
System.out.println(substring);
}
}
}
测试 key 失效功能,
需要先配置redis,重启项目后,这里的 监听方法才能生效。
public class Test(){
//@Resource
//private RedisTemplate redisTemplate;
// 这里也可以使用 静态注入
private static RedisTemplate redisTemplate;
@Resource
public void setRedisTemplate(RedisTemplate redisTemplate) {
Test.redisTemplate = redisTemplate;
}
public static void main(String[] args) {
redisTemplate.opsForValue().set("orderNo:156556263124101022","dadada" ,5, TimeUnit.SECONDS );
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)