spring boot整合redis 设置监听过期Key并拿到这个key

最近写了个定时的任务,不知道怎么做,查资料后用redis事件监听可以做,后来完成了,分享给有需要的朋友。

参考:https://blog.csdn.net/qq_39648029/article/details/105072079

/*redis监听过期时间设置*/
public class KeyExpiredListener extends KeyExpirationEventMessageListener {

    public KeyExpiredListener(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }

    @Override
    public void onMessage(Message message, byte[] pattern) {
        System.out.println("过期key:" + message.toString());
        String inquiryEnquiryNumber = new String(message.getBody());
        System.out.println(inquiryEnquiryNumber);

        if(inquiryEnquiryNumber.startsWith("CLEAN")) {

            //此处为获取的redis中key值中开头是否是“CLEAN”的判断,是了就执行接下来的操作

        }
    }


}

/*redis监听过期时间设置*/
@Configuration
public class RedisConfiguration {



    @Autowired
    private RedisConnectionFactory redisConnectionFactory;

    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer() {
        RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
        redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
        return redisMessageListenerContainer;
    }

    @Bean
    public KeyExpiredListener keyExpiredListener() {
        return new KeyExpiredListener(this.redisMessageListenerContainer());
    }


}
//测试
    @RequestMapping("qq")
    @ResponseBody
    public JsonResult showLiddne(HttpServletRequest request){
        Jedis jedis = redisUtil.getJedis();
        jedis.setex("aaa",1*10,"bbb");
//        String value = jedis.get("aaa");
        return null;
    }
    @RequestMapping("ww")
    @ResponseBody
    public String showLxxiddne(HttpServletRequest request){
        Jedis jedis = redisUtil.getJedis();
        String value = jedis.get("aaa");
        return value;
    }

结果

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud分布式程序中,如果多个实例都监听同一个Redis key过期事件,可能会导致重复消费的问题。因为Rediskeyspace notifications功能是发布-订阅模式,每个订阅者都会收到相同的事件通知。 为了避免这个问题,可以使用分布式锁来控制只有一个实例能够处理该事件。常用的分布式锁包括Redisson、ZooKeeper、Curator等。 以下是使用Redisson实现分布式锁的示例代码: 1. 添加Redisson和Spring Data Redis依赖: ```xml <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.14.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 2. 创建一个RedissonClient Bean: ```java @Bean public RedissonClient redissonClient() { Config config = new Config(); config.useSingleServer().setAddress("redis://localhost:6379"); return Redisson.create(config); } ``` 3. 创建一个RedisKeyExpirationListener类,并在其中加入分布式锁逻辑: ```java public class RedisKeyExpirationListener { private static final String LOCK_NAME = "key-expiration-lock"; @Autowired private RedissonClient redissonClient; public void onMessage(Message message, byte[] pattern) { String expiredKey = message.toString(); RLock lock = redissonClient.getLock(LOCK_NAME); try { if (lock.tryLock()) { // 这里可以写你要执行的代码 System.out.println("Key expired: " + expiredKey); } } finally { lock.unlock(); } } } ``` 4. 将RedisKeyExpirationListener注册到RedisMessageListenerContainer中: ```java @Autowired private RedisMessageListenerContainer redisMessageListenerContainer; @Autowired private MessageListenerAdapter messageListenerAdapter; @PostConstruct public void init() { // 要监听key的pattern String pattern = "__keyevent@0__:expired"; redisMessageListenerContainer.addMessageListener(messageListenerAdapter, new PatternTopic(pattern)); } ``` 通过加入分布式锁逻辑,可以确保只有一个实例能够处理该事件,避免了重复消费的问题。需要注意的是,锁的粒度应该尽量小,避免对性能产生影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值