redis键的过期事件:
首先修改redis.windows.conf中的配置
这里把默认的notify-keyspace-events ""改成notify-keyspace-events Ex
notify-keyspace-events Ex
是一个配置指令,用于 Redis 。这个指令允许用户订阅某些类型的键空间通知。其中的 Ex 代表的事件类型是:键过期事件。就是当 Redis 中的某个键到期(也就是键所设定的超时时间到了)时,将会发出此类事件。
1)E 代表 expired 事件,表示某个 key 已经过期并被删除。
2)x 代表 expired entry script execution 事件。当某个 key 过期时,如果配置了相应的脚本或定时任务进行键过期的行为处理,如脚本的延时删除或者释放一些锁操作等。
然后编写配置类RedisConfig和监听器RedisKeyExpirationListener(监听并处理redis键值过期事件)
@Configuration
@EnableCaching
public class RedisConfig {
@Value("${spring.datasource.redis.host}")
private String host;
@Value("${spring.datasource.redis.port}")
private int port;
@Value("${spring.datasource.redis.password}")
private String password;
@Autowired
public static RedisTemplate<Object, Object> redisTemplate;
public static JedisConnectionFactory jedisConnectionFactory;
/**
* key为Object,value为Object的配置
*
* @return
*/
@Bean
public RedisTemplate<Object, Object> setSTSRedisConfig() {
redisTemplate = new RedisTemplate<>();
//解决序列化
redisTemplate.setDefaultSerializer(StringRedisSerializer.UTF_8);//默认的序列化程序
redisTemplate.setKeySerializer(new StringRedisSerializer());//序列化键
redisTemplate.setValueSerializer(new StringRedisSerializer());//序列化值
//Java连接redis的工厂类
jedisConnectionFactory = new JedisConnectionFactory();
jedisConnectionFactory.setHostName(host);
jedisConnectionFactory.setPort(port);
jedisConnectionFactory.setUsePool(true);//使用连接池
jedisConnectionFactory.setPassword(password);
jedisConnectionFactory.afterPropertiesSet();//必须填,因为前面的设置后,需要调用afterPropertiesSet方法来完成初始化
redisTemplate.setConnectionFactory(jedisConnectionFactory);
redisTemplate.afterPropertiesSet();//必须填,因为前面的设置后,需要调用afterPropertiesSet方法来完成初始化
return redisTemplate;
}
/**
* 创建监听redis事件的容器
* @return
*/
@Bean
RedisMessageListenerContainer container() {
jedisConnectionFactory = new JedisConnectionFactory();
jedisConnectionFactory.setHostName(host);
jedisConnectionFactory.setPort(port);
jedisConnectionFactory.setUsePool(true);//使用连接池
jedisConnectionFactory.setPassword(password);
jedisConnectionFactory.afterPropertiesSet();//必须填,因为前面的设置后,需要调用afterPropertiesSet方法来完成初始化
//用于监听Redis发布/订阅模式中的消息
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(jedisConnectionFactory);
return container;
}
}
@Slf4j
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Resource
private TransactionsService transactionsService;
//这里写处理逻辑
@Override
public void onMessage(Message message, byte[] pattern) {
String expiredKey = message.toString();
log.info("Redis 过期 key: {}", expiredKey);//打印过期键的日志信息\
//下面就是处理逻辑
。。。。
}
}