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

开启操作

notify-keyspace-events ""

更变为 

notify-keyspace-events "Ex"

设置完成后,重启Redis!

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

添加Maven依赖

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

弄一个Redis 配置类

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

添加一个组件

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 你可以正常执行你需要的代码逻辑!
    }
}

搞定

开始测试


    @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即可!!!