一、创建监听配置类 RedisListenerConfig。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;@Configuration
public class RedisListenerConfig {@BeanRedisMessageListenerContainer listenerContainer(RedisConnectionFactory connectionFactory) {RedisMessageListenerContainer listenerContainer = new RedisMessageListenerContainer();listenerContainer.setConnectionFactory(connectionFactory);return listenerContainer;}@BeanKeyExpirationEventMessageListener redisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {return new RedisKeyExpirationListener(listenerContainer);}}
二、 创建监听器: RedisKeyExpirationListener 继承 KeyExpirationEventMessageListener .
这里只能获取到 过期的key,无法获取过期的value.
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;@Slf4j
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {@AutowiredRedisTemplate redisTemplate ;/*** Creates new {@link } for {@code __keyevent@*__:expired} messages.** @param listenerContainer must not be {@literal null}.*/public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {super(listenerContainer);}/*** 针对redis数据失效事件,进行数据处理** @param message* @param pattern*/@Overridepublic void onMessage(Message message, byte[] pattern) {//获得失效的keySystem.out.println("onMessage pattern " + pattern + " " + " " + message);String channel = new String(message.getChannel());System.out.println(channel);}}
三: 设置redis的配置文件redis.config中的 notify-keyspace-events 为 Ex
四、验证一下:
在redis客户端执行:setex localhost:1>key 5 value 设置一个过期的key
观察idea控制台:发现打印了过期的key,成功监听到过期的数据。
参考博客: