已解决
监听redis键失效事件实现延迟功能
来自网友在路上 150850提问 提问时间:2023-10-22 00:01:47阅读次数: 50
最佳答案 问答题库508位专家为你答疑解惑
用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,所以需进行相关过滤
其实就是底层原理就是 订阅-发布模式
查看全文
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"监听redis键失效事件实现延迟功能":http://eshow365.cn/6-21134-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!