SpringBoot整合 Redis Key过期反馈 notify-keyspace-event

2022-01-19 15:01:36 浏览数 (1)

notify-keyspace-event 是Redis 2.8 版本之后有的功能,需要手动去开启

开启操作

代码语言:javascript复制
notify-keyspace-events ""

更变为 

notify-keyspace-events "Ex"

设置完成后,重启Redis!

开启Redis支持Key失效事件后,就可以用代码去订阅这个事件了!

添加Maven依赖

代码语言:javascript复制
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

弄一个Redis 配置类

代码语言:javascript复制
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;

/**
 * @author : zanglikun
 * @date : 2021/10/20 11:47
 * @Version: 1.0
 * @Desc : Redis 配置类,用于Redis的Key失效的事件监听。
 */
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {

    @Autowired
    RedisConnectionFactory redisConnectionFactory;

    /*
        这里不能丢,有了这个Bean才能又Key失效事件的监听
     */
    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer(){
        RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
        redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
        return redisMessageListenerContainer;
    }
}

添加一个组件

代码语言:javascript复制
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;

/**
 * @author : zanglikun
 * @date : 2021/10/20 11:50
 * @Version: 1.0
 * @Desc : Redis的Key 过期监听时间
 */
@Component
public class RedisKeyExpiration extends KeyExpirationEventMessageListener {

    public RedisKeyExpiration(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }

    // 这是继承KeyExpirationEventMessageListener 主动重写的方法,用于处理当监听到了Key失效的时间
    @Override
    public void onMessage(Message message, byte[] pattern) {
        super.onMessage(message, pattern);
        System.out.println("当前失效的Key是:" message);
        // TODO 你可以正常执行你需要的代码逻辑!
    }
}

搞定

开始测试

代码语言:javascript复制
    @Test
    public void testRedisKeyExpire() {
        for (int i = 0; i < 1000; i  ) {
            redisTemplate.opsForValue().set("Key_" i, "Value_" i, 10, TimeUnit.SECONDS);
        }
        System.out.println("执行成功");
    }

控制台输出

至于乱码,很简单,RedisTemplate字符编码与序列化的时候有问题,自己重新弄一个RedisConfig并追加本文的内容即可RedisConfig的Bean即可!!!

特殊说明: 解决问题的光鲜,藏着磕Bug的痛苦。 万物皆入轮回,谁也躲不掉! 以上文章,均是我实际操作,写出来的笔记资料,不会出现全文盗用别人文章!烦请各位,请勿直接盗用!

0 人点赞