1.根据配置的超时监听配置查看继承的监听器
public class RedisExpireListener extends KeyExpirationEventMessageListener {
private static final Logger LOG = LoggerFactory.getLogger(RedisExpireListener.class);
public RedisExpireListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Override
public void onMessage(Message message, byte[] pattern) {
//过期的key
String key = new String(message.getBody(), StandardCharsets.UTF_8);
// 监听到key过期,对key进行后续处理
LOG.info("监听到redis-key-{}过期",key);
}
}
2.进入KeyExpirationEventMessageListener查看相关源码
public class KeyExpirationEventMessageListener extends KeyspaceEventMessageListener implements ApplicationEventPublisherAware {
private static final Topic KEYEVENT_EXPIRED_TOPIC = new PatternTopic("__keyevent@*__:expired");
@Nullable
private ApplicationEventPublisher publisher;
public KeyExpirationEventMessageListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
protected void doRegister(RedisMessageListenerContainer listenerContainer) {
listenerContainer.addMessageListener(this, KEYEVENT_EXPIRED_TOPIC);
}
protected void doHandleMessage(Message message) {
this.publishEvent(new RedisKeyExpiredEvent(message.getBody()));
}
protected void publishEvent(RedisKeyExpiredEvent event) {
if (this.publisher != null) {
this.publisher.publishEvent(event);
}
}
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.publisher = applicationEventPublisher;
}
}
发现默认配置为"__keyevent@*__:expired"
3.可以重写doRegister方法设置指定监听的的数据库
public class RedisExpireListener extends KeyExpirationEventMessageListener {
private static final Logger LOG = LoggerFactory.getLogger(RedisExpireListener.class);
public RedisExpireListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Override
protected void doRegister(RedisMessageListenerContainer listenerContainer) {
Topic KEYEVENT_EXPIRED_TOPIC = new PatternTopic("__keyevent@"+ config.getRedisDb() +"__:expired");
listenerContainer.addMessageListener(this, KEYEVENT_EXPIRED_TOPIC);
}
@Override
public void onMessage(Message message, byte[] pattern) {
//过期的key
String key = new String(message.getBody(), StandardCharsets.UTF_8);
// 监听到key过期,对key进行后续处理
LOG.info("监听到redis-key-{}过期",key);
}
}