- 在springboot项目中配置监听redis的失效key:
- 注入redis消息监听容器
/**
* Redis 消息监听器容器.
* [@param] redisConnectionFactory
* [@return]
*/
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory redisConnectionFactory) {
RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
return redisMessageListenerContainer;
}
- Redis Key失效监听器注册为Bean.
/**
* Redis Key失效监听器注册为Bean.
*
* [@param] redisMessageListenerContainer the redis message listener container
* [@return] the redis event message listener
*/
@Bean
public RedisEventMessageListener redisEventMessageListener(RedisMessageListenerContainer redisMessageListenerContainer){
return new RedisEventMessageListener(redisMessageListenerContainer);
}
- 失效的监听类
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import java.time.LocalDateTime;
/**
* @ClassName: RedisEventMessageListener
* @Description: TODO
* @Author: $
* @Date: 2022/4/19 18:07
**/
@Slf4j
public class RedisEventMessageListener extends KeyExpirationEventMessageListener {
/**
* Creates new {@link MessageListener} for
* {@code __keyevent@*__:expired} messages.
*
* @param listenerContainer must not be {@literal null}.
*/
public RedisEventMessageListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Override
protected void doHandleMessage(Message message) {
// 这个就是过期的key ,过期后,也就是事件触发后对应的value是拿不到的。
// 这里实现业务逻辑,如果是服务器集群的话需要使用分布式锁进行抢占执行。
String key = message.toString();
System.out.println("key = " + key);
System.out.println("end = " + LocalDateTime.now());
}
}