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

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

相关推荐
呼拉拉呼拉14 分钟前
Redis高可用架构
数据库·redis·架构·高可用架构
用户79117724235831 小时前
黑马点评【基于redis实现共享session登录】
java·redis
观无2 小时前
redis分布式锁
数据库·redis·分布式
颜淡慕潇2 小时前
Redis 实现分布式锁:深入剖析与最佳实践(含Java实现)
java·redis·分布式
CV点灯大师3 小时前
C++算法训练营 Day10 栈与队列(1)
c++·redis·算法
啾啾Fun3 小时前
【Java微服务组件】分布式协调P4-一文打通Redisson:从API实战到分布式锁核心源码剖析
java·redis·分布式·微服务·lua·redisson
多多*6 小时前
LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考
linux·开发语言·redis·python·bootstrap·lua
陈阿土i13 小时前
SpringAI 1.0.0 正式版——利用Redis存储会话(ChatMemory)
java·redis·ai·springai
bing_15813 小时前
跨多个微服务使用 Redis 共享数据时,如何管理数据一致性?
redis·微服务·mybatis
多多*14 小时前
微服务网关SpringCloudGateway+SaToken鉴权
linux·开发语言·redis·python·sql·log4j·bootstrap