RedisKey的失效监听器KeyExpirationEventMessageListener问题

 更新时间:2024年05月27日 10:24:13   作者:是小故事呀  
这篇文章主要介绍了RedisKey的失效监听器KeyExpirationEventMessageListener问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

RedisKey的失效监听器KeyExpirationEventMessageListener

利用KeyExpirationEventMessageListener实现redis的key失效监听。

在使用redis时,所有的key都要设置过期时间,过期之后,redis就会把对应的key清除掉。

此方法可以监听redis的key失效,在失效时做一些逻辑处理。话不多说,上代码。

依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

实现

import com.upbim.twin.park.common.constans.Constants;
import com.upbim.twin.park.server.strategy.PushMessageStrategyContext;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.Topic;
import org.springframework.stereotype.Service;

import java.util.UUID;

import static com.upbim.twin.park.common.constans.Constants.TRACE_ID;
@Slf4j
@Service
public class AgentOrderRedisKeyExpiredListener extends KeyExpirationEventMessageListener {

    @Autowired
    private PushMessageStrategyContext pushMessageStrategyContext;
    @Autowired
    private RedisProperties redisProperties;

    /**
     * Creates new  MessageListener for {@code __keyevent@*__:expired} messages.
     *
     * @param listenerContainer must not be {@literal null}.
     */
    public AgentOrderRedisKeyExpiredListener(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }

    @Override
    protected void doRegister(RedisMessageListenerContainer listenerContainer) {

        // 只监听指定redis数据库的key过期事件
        Topic topic = new PatternTopic(String.format("__keyevent@%s__:expired", redisProperties.getDatabase()));
        listenerContainer.addMessageListener(this, topic);
    }

    @Override
    protected void doHandleMessage(Message message) {

        // 订阅的topic: new String(message.getChannel(), UTF_8) --->  "__keyevent@0__:expired"
        // 触发key失效发布的key:new String(message.getBody(), UTF_8) --->  "demoKey"
        MDC.put(TRACE_ID, UUID.randomUUID().toString());
        try {
            log.info(String.format("Redis key expired event:%s", message.toString()));

            String beanName = message.toString().split(Constants.COLON)[Constants.ONE];
            pushMessageStrategyContext.handleRedisExpireKey(beanName, message.toString());
            super.doHandleMessage(message);
        } finally {

            MDC.clear();
        }
    }

}

监听处理类

package com.upbim.twin.park.server.strategy;

import com.google.common.collect.Maps;
import com.upbim.twin.park.server.strategy.nozzle.PushMessageStrategy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.Objects;

@Slf4j
@Component
public class PushMessageStrategyContext {

    /**
     * 使用线程安全的ConcurrentHashMap存储所有实现Strategy接口的Bean
     * key:beanName
     * value:实现Strategy接口Bean
     */
    private final Map<String, PushMessageStrategy> strategyMap = Maps.newConcurrentMap();

    /**
     * 注入所有实现了Strategy接口的Bean
     *
     * @param strategyMap the strategy map
     */
    @Autowired
    public PushMessageStrategyContext(Map<String, PushMessageStrategy> strategyMap) {
        strategyMap.forEach(this.strategyMap::put);
    }

    /**
     * 策略监听redis所有过期key
     *
     * @param beanName        the bean name
     * @param redisInvalidKey the redis invalid key
     * @return
     */
    public void handleRedisExpireKey(String beanName, String redisInvalidKey) {

        if (Objects.nonNull(strategyMap.get(beanName))) {
            strategyMap.get(beanName).handleRedisExpireKey(redisInvalidKey);
        } else {
            log.warn("找不到对应的策略:{}", strategyMap.get(beanName));
        }
    }

}
public interface PushMessageStrategy {
  void handleRedisExpireKey(String redisInvalidKey);
}

大家在使用的时候,可以针对自己不同的场景,实现PushMessageStrategy 接口,重写handleRedisExpireKey方法。

在方法中处理不同的逻辑。

首先,在redis’中有key失效过期时,AgentOrderRedisKeyExpiredListener 监听到redis实现,会执行doHandleMessage方法,方法中会调用PushMessageStrategyContext 的获取不同策略的Bean,进行业务操作。

至此,监听redis中key失效完成。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot全局异常处理方式

    SpringBoot全局异常处理方式

    这篇文章主要介绍了SpringBoot全局异常处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java实现停车场管理系统

    java实现停车场管理系统

    这篇文章主要为大家详细介绍了java实现停车场管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • springboot整合RabbitMQ发送短信的实现

    springboot整合RabbitMQ发送短信的实现

    本文会和SpringBoot做整合,实现RabbitMQ发送短信,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • Java fastjson2 解析JSON用法详解

    Java fastjson2 解析JSON用法详解

    Fastjson2是Fastjson的升级版,提供了更好的性能和扩展性,它支持多种方式解析JSON数据,包括将JSON字符串转换为Java对象、嵌套的JSON对象和数组,以及转换成Map或List,本文介绍Java fastjson2 解析JSON用法,感兴趣的朋友一起看看吧
    2025-02-02
  • Idea jdk版本问题解决方案

    Idea jdk版本问题解决方案

    这篇文章主要介绍了Idea jdk版本问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • java轻量级规则引擎easy-rules使用介绍

    java轻量级规则引擎easy-rules使用介绍

    这篇文章主要介绍了java轻量级规则引擎easy-rules使用介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • java实现图片用Excel画出来

    java实现图片用Excel画出来

    这篇文章主要为大家详细介绍了java实现图片用Excel画出来,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • springboot vue组件开发实现接口断言功能

    springboot vue组件开发实现接口断言功能

    这篇文章主要为大家介绍了springboot+vue组件开发实现接口断言功能,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Java中读写锁ReadWriteLock的原理与应用详解

    Java中读写锁ReadWriteLock的原理与应用详解

    Java并发编程提供了读写锁,主要用于读多写少的场景,今天我们就重点来讲解读写锁ReadWriteLock的原理与应用场景,感兴趣的可以了解一下
    2022-09-09
  • 如何把spring boot项目部署到tomcat容器中

    如何把spring boot项目部署到tomcat容器中

    本文给大家分享如何把spring boot项目部署到tomcat容器中,本文给大家介绍的非常详细,需要的朋友参考下
    2017-04-04

最新评论