现象:
redis 过期事件监听

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

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

在这里插入图片描述

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


public interface WxRedisMessageListener {
}

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

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WxRedisListener {
    /** 过期事件订阅的key */
    String key();
}

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);
    }
}

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);
     }
 }

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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐