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的痛苦。 万物皆入轮回,谁也躲不掉! 以上文章,均是我实际操作,写出来的笔记资料,不会出现全文盗用别人文章!烦请各位,请勿直接盗用!