之前我使用过使用Redisson这种Redis的框架实现过延时发送。今天突然好奇,在SpringBoot中,Redis能监听到Key失效事件吗?经过查资料,答案是肯定的,可以监听Key失效,但是有缺陷,监听事件里面只能拿到Key,不能拿到这个Key对应的Value。所以说,在生成这个Key的时候,需要把这个Key对应的Value存放到数据库中,以便在失效事件中再去查询一下数据库。

        Redis的Key失效事件在SpringBoot中可以做一些订阅功能,比如延时发送邮件等。

        配置的话像下面一样就好了。

@Configuration
public class RedisConfig ....

@Bean
public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {

RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
}

        消费端

@Component
public class RedisExpiredListener extends KeyExpirationEventMessageListener ...

private static final String ORDER_PREFIX = "Order:";

public RedisExpiredListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}

@Override
public void onMessage(Message message, byte[] pattern) {
//获取失效的key
String expiredKey = message.toString();

if (expiredKey.startsWith(ORDER_PREFIX)) {
//如果是Order:开头的key,消费Key
LOGGER.info("消费Key:{}", message);
//someService.findDataByKey(key);
//do something ...
}
}
}