springboot监听Redis 缓存过期(Key 失效)事件
1、Redis配置修改
事件通过 Redis 的订阅与发布功能(pub/sub)来进行分发, 故需要开启 redis 的事件监听与发布 修改 redis.conf 文件(Windows上是redis.windows.conf和redis.windows-service.conf)
notify-keyspace-events Ex
2、 redis的配置类开启 redis过期监听
/** * 开启 redis过期监听 * @param connectionFactory * @return */ @Bean RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); return container; }
3、定义 key过期监听器,继承 KeyExpirationEventMessageListener
@Slf4j @Component public class RedisListener extends KeyExpirationEventMessageListener { public RedisListener(RedisMessageListenerContainer listenerContainer) { super(listenerContainer); } /** * 针对redis缓存数据失效事件,进行后续数据处理 * * @param message * @param pattern */ @Override public void onMessage(Message message, byte[] pattern) { /** key ,会把key返回,而不会将value返回*/ String expiredKey = message.toString(); log.info("过期缓存key:" + expiredKey); try { //登陆信息过期 若expiredKey以login开始则打印log if (expiredKey.startsWith("login")){ log.info("---------redis 过期缓存处理"); } } catch (Exception e) { log.info("---------redis 过期缓存处理 异常---------"); e.printStackTrace(); } } }
通过开启key过期的事件通知,当key过期时,会发布过期事件;我们定义key过期事件的监听器,当key过期时,就能收到回调通知。 注意: 1)由于Redis key过期删除是定时+惰性,当key过多时,删除会有延迟,回调通知同样会有延迟。 2)回调通知是一次性的,没有ack机制,若收到通知后处理失败,将不再收到通知。 3)回调通知只能拿到key,拿不到value。
使用场景: 1)可以实现延时队列 消息作为key,将需要延迟的时间设置为key的TTL,当key过期时,在监听器收到通知,达到延迟的效果。
下一篇:
iic时钟速率_STM32之硬件IIC