• redis过期事件监听


    现象:
    redis 过期事件监听

    通过KeyExpirationEventMessageListener类实现redis失效监听事件
    方法

    1.打开redis 监听事件开关
    需要修改redis.conf配置文件,找到 EVENT NOTIFICATION (事件通知)这个配置
    notify-keyspace-events “” 修改为 notify-keyspace-events “Ex”

    在这里插入图片描述

    2.编写自己的接口 提供给业务实现

    
    public interface WxRedisMessageListener {
    }
    
    • 1
    • 2
    • 3

    3.在redis基础服务定义自定义注解 来控制业务方法监听的redis key

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface WxRedisListener {
        /** 过期事件订阅的key */
        String key();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.redis基础服务继承 KeyExpirationEventMessageListener类 注入自己的接口 获取实现类方法 通过自定义注解中的key与redis过期key匹配来控制每个key过期调用不同方法

    
    @Slf4j
    @Configuration
    public class RedisListenerConfig extends KeyExpirationEventMessageListener {
    
        @Autowired
        public RedisListenerConfig(RedisMessageListenerContainer listenerContainer) {
            super(listenerContainer);
        }
    
        @Autowired(required = false)
        private WxRedisMessageListener wxRedisMessageLister;
    
        @Override
        public void onMessage(Message message, byte[] pattern) {
            String key = new String(message.getBody(), StandardCharsets.UTF_8);
            log.debug("[redis过期消息监听] 消费者监听key:{}", key);
            try {
    	        // 获取自己实现类获取实现类全部方法
                var methods = wxRedisMessageLister.getClass().getDeclaredMethods();
                log.debug("[redis过期消息监听] 消费者监听方法:{}", Arrays.toString(methods));
                for (var method : methods) {
                    // 获取方法的注解判断是否与过期key一致
                    var annotation = method.getAnnotation(WxRedisListener.class);
                    if (annotation == null) {
                        continue;
                    }
                    if (key.contains(annotation.key())) {
                        method.invoke(wxRedisMessageLister, key);
                        log.debug("[redis消息过期监听] 消费成功:key [{}],message:[{}]", key, message);
                    }
                }
            } catch (Exception e) {
                log.error("[redis消息过期监听] 消费失败:key [{}],message:[{}]", key, message,e);
            }
            super.onMessage(message, pattern);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    5.在业务服务实现自己的接口 来实现逻辑
    自定义注解来控制监听的key

    public class RedisKeyTimeOutListener implements WxRedisMessageListener {
    
        // 业务service
        @Autowired private XXXXService xxxxService
    
        @WxRedisListener(key = "wx:center:redis:timing:group")
        public void run(String key) {
            log.debug("redis 过期监听:[{}]", key);
                xxxxService.failureGroup(key);
         }
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    注:redis过期监听 不像mq有保证 不推荐用来弄需要有保证的业务

  • 相关阅读:
    【C++】BMI身体质量指数计算工具
    SpringBoot排除不需要的自动配置类
    振南技术干货集:深入浅出的Bootloader(4)
    Git 使用指南(附详细解释)
    【MySQL】MySQL基础部分知识点
    Redis 到底是单线程还是多线程呢?
    华为OD机考算法题:靠谱的车
    [位运算]leetcode2401:最长优雅子数组(medium)
    2138. 将字符串拆分为若干长度为 k 的组-力扣双百代码
    Mall微服务版本全面升级,支持最新版SpringCloud
  • 原文地址:https://blog.csdn.net/hcwbr123/article/details/126036897