监听器
// redis 监听键的过期有两种方式,第二种需要解决循环依赖,此处选择第一种
@Slf4j
@Component
public class KeyExpirationListener extends KeyExpirationEventMessageListener {
public KeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Override
public void onMessage(Message message, byte[] pattern) {
String string = message.toString();
log.info("key:" + string);
// 进行过期处理,此处略,Spring 监听 key 的过期只能返回键,若需要值需要进行
// 一次拷贝,然后将它删除
}
}
@Configuration
public class RedisConfig {
@Bean
public RedisConnectionFactory redisConnectionFactory() {
// JedisConnectionFactory 在部分版本会产生冲突,此处使用 LettuceConnectionFactory
return new LettuceConnectionFactory();
}
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
return redisTemplate;
}
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer() {
return new RedisMessageListenerContainer();
}
@Bean
public KeyExpirationListener keyExpirationListener() {
// keyExpirationListener 本质上是一个订阅了 __keyevent@*__:expired 的 topic
return new KeyExpirationListener(redisMessageListenerContainer());
}
}