KeyExpirationEventMessageListener过期事件
key的过期事件发布时机并不是当这个key的过期时间到了之后就发布,而是这个key在Redis中被清理之后,也就是真正被删除之后才会发布,所以会有滞后性。
demo
引入pom
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
redis配置
spring:
redis:
host: 127.0.0.1
port: 6379
password:
database: 10
lettuce:
pool:
max-active: 100 # 连接池最大连接数(使用负值表示没有限制) 默认 8
max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
max-idle: 10 # 连接池中的最大空闲连接 默认 8
min-idle: 4 # 连接池中的最小空闲连接 默认 0
timeout: 3000 # 连接超时时间(毫秒)
创建bean
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
//注入redisMessageListenerContainer
@Bean
public RedisMessageListenerContainer container(LettuceConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
}
redis过期事件监听
@Component
@Slf4j
public class RedisKeyExpirtListener extends KeyExpirationEventMessageListener {
public RedisKeyExpirtListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Override
public void onMessage(Message message, byte[] pattern) {
String expiredKey = message.toString();
log.info("expiredKey:" + expiredKey);
log.info("message.getBody():" + new String(message.getBody()));
log.info("message.getChannel():" + new String(message.getChannel()));
log.info("pattern:" + new String(pattern));
}
}
结尾
由于Redis key过期删除是定时+惰性,所以会有一定延时。过期监听事件只能通知一次,并且只能获取到key,获取不到value值。实际使用中需要注意。