2022年4月18日
redis的缓存过期回调的实现延时队列
参考:redis主键过期监听 – 爱李丫头 – 博客园 (cnblogs.com),系统挂了,可能导致检监控有问题吧。。
1. 开启过期事件
notify-keyspace-events Ex
2.提供容器
注册 RedisMessageListenerContainer ,为Redis消息侦听器提供异步行为的容器
@Configuration
public class RedisConfigurer extends CachingConfigurerSupport {
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
}
}
3.实现监听逻辑
//创建监听,继承KeyExpirationEventMessageListener ,重写onMessage方法
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Autowired
private OrderItemService orderItemService;
private static Logger log = LoggerFactory.getLogger(RedisKeyExpirationListener.class);
@Override
public void onMessage(Message message, byte[] pattern) {
//在这里处理业务,因为时键过期,所以只能拿到键值,不能拿到value
String expiredKey = message.toString();
log.info("Redis主键过期监听" + expiredKey);
if (expiredKey.startsWith("order:")) {
log.info("Redis主键过期监听符合要求的主键" + expiredKey);
//Todo取消订单
orderItemService.updateCannelOrderByTimeOut(expiredKey);
}
}
}