监听redis键失效事件实现延迟功能

编程入门 行业动态 更新时间:2024-10-25 18:27:13

监听redis键失效<a href=https://www.elefans.com/category/jswz/34/1770959.html style=事件实现延迟功能"/>

监听redis键失效事件实现延迟功能

用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,所以需进行相关过滤

其实就是底层原理就是 订阅-发布模式

更多推荐

监听redis键失效事件实现延迟功能

本文发布于:2023-12-07 01:51:21,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1669712.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:事件   功能   redis

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!