redis过期事件监听
4.redis基础服务继承KeyExpirationEventMessageListener类注入自己的接口获取实现类方法通过自定义注解中的key与redis过期key匹配来控制每个key过期调用不同方法。将notify-keyspace-events“”修改为notify-keyspace-events“Ex”3.在redis基础服务定义自定义注解来控制业务方法监听的rediskey。注redi
·
现象:
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有保证 不推荐用来弄需要有保证的业务
更多推荐



所有评论(0)