当前位置 博文首页 > 谢哥哥的博客:【redis】redis之过期监听

    谢哥哥的博客:【redis】redis之过期监听

    作者:[db:作者] 时间:2021-07-13 13:15

    redis之过期监听

    使用场景:在我们项目中,需要把支付超时的订单,更新状态并回退库存等操作。在这里,使用redis过期监听就能做到

    ↓↓↓下面上代码↓↓↓

    首先需要redis监听生效就需要配置如下代码

    yml文件

    在这里插入图片描述

    RedisListenerConfig.java

    @Slf4j
    @Configuration
    public class RedisListenerConfig {
    
        @Bean
        public RedisMessageListenerContainer container(RedisConnectionFactory redisConnectionFactory) {
            RedisMessageListenerContainer container = new RedisMessageListenerContainer();
            container.setConnectionFactory(redisConnectionFactory);
            log.info("redis监听配置生效");
            return container;
        }
    }
    

    使用
    RedisKeyExpirationListener.java

    @Slf4j
    @Configuration
    public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
    
        @Value("${spring.redis.database}")
        private Integer redisDatabase;
    
        private final RedisTemplate<String, String> redisTemplate;
    
        public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer, RedisTemplate<String, String> redisTemplate) {
            super(listenerContainer);
            this.redisTemplate = redisTemplate;
        }
    
        @Override
        public void onMessage(Message message, byte[] bytes) {
            log.info("过期监听事件启动");
            RedisSerializer<?> serializer = redisTemplate.getValueSerializer();
            String channel = String.valueOf(serializer.deserialize(message.getChannel()));
            // 获取过期的Key值
            String body = String.valueOf(serializer.deserialize(message.getBody()));
            // DB0 key过期监听
            if (StrUtil.format("__keyevent@{}__:expired", redisDatabase).equals(channel)) {
                System.out.println("第" + redisDatabase + "个DB库的key过期,key:" + body);
            }
        }
    }
    

    我们测试一下

    在这里插入图片描述
    等待30秒…

    结果如下

    在这里插入图片描述

    总结

    如果觉得不错,可以点赞+收藏或者关注下博主。感谢阅读!

    cs