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过期时,在监听器收到通知,达到延迟的效果。

精彩链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。