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

用Redis实现延迟队列,我研究了两种方案,发现并不简单

SpringBoot实现Redis失效监听事件---KeyExpirationEventMessageListener

Redis 监听过期的key(KeyExpirationEventMessageListener)

项目背景

需求上说,需要延迟半小时才能更新数据状态。问过架构,说项目暂不支持rocketmq。评估过kafka,可惜支持度不够,如果要实现也会相当复杂。

最终考量使用 redission ,通过监听键失效事件实现延时更新状态效果

技术落地

引入pom

xml 复制代码
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>x</version>
</dependency>

配置类

java 复制代码
@Configuration
public class RedisConfig {

    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        return container;
    }

    @Bean
    public KeyExpirationEventMessageListener redisKeyExpirationListener(RedisMessageListenerContainer redisMessageListenerContainer){
        return new KeyExpirationEventMessageListener(redisMessageListenerContainer);
    }
}

redis,保存设置了过期时间的key

java 复制代码
@Autowired
private RedissonClient redissonClient;

public void setExpiredKey(){
    //添加分布式锁,避免重复设置相同key
    RLock 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

java 复制代码
@Component
public class MyListener extends KeyExpirationEventMessageListener {

    @Override
    public void onMessage(Message message, byte[] pattern) {
        //业务处理,调用相关方法对失效的key进行相关处理
    }
}

但注意,这里会监听所有失效的key,所以需进行相关过滤

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

相关推荐
Hello.Reader8 小时前
Redis热点数据管理全解析:从MySQL同步到高效缓存的完整解决方案
redis·mysql·缓存
C++忠实粉丝9 小时前
Redis 介绍和安装
数据库·redis·缓存
ClouGence10 小时前
Redis 到 Redis 数据迁移同步
数据库·redis·缓存
苏三说技术10 小时前
Redis 性能优化的18招
数据库·redis·性能优化
Tttian62211 小时前
基于Pycharm与数据库的新闻管理系统(2)Redis
数据库·redis·pycharm
言之。11 小时前
redis延迟队列
redis
hanbarger12 小时前
nosql,Redis,minio,elasticsearch
数据库·redis·nosql
弗罗里达老大爷13 小时前
Redis
数据库·redis·缓存
DT辰白1 天前
基于Redis的网关鉴权方案与性能优化
数据库·redis·缓存
木子七1 天前
Redis-十大数据类型
redis