redis 自动过期的实现方式是:定时任务离线扫描并删除部分过期键;在访问键时惰性检查是否过期并删除过期键。redis 从未保证会在设定的过期时间立即删除并发送过期通知。实际上,过期通知晚于设定的过期时间数分钟的情况也比较常见。
此外键空间通知采用的是发送即忘(fire and forget)策略,并不像消息队列一样保证送达。当订阅事件的客户端会丢失所有在断线期间所有分发给它的事件。
这是一种比定时扫描数据库更 “LOW” 的解决方案,自己玩可以,大项目上请不要使用。
流程
1. 下单 存redis key(token) value(orderId) ex失效时间
2. 超时redis的key回调方法. 判断key在库中订单状态
3.根据订单状态,做业务处理
具体操作
1.redis配置文件开启key过期回调
2.监听接口
@Configuration
public class RedisListenerConfig {
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory factory){
RedisMessageListenerContainer container=new RedisMessageListenerContainer();
container.setConnectionFactory(factory);
return container;
}
}
3.重写失效回调方法(这里的redis 的 key 最好做前缀处理,判断key前缀匹配然后查询 ,或者选定特定的库存储)
@Component
public class RedisKeyExpirationListerner extends KeyExpirationEventMessageListener {
public RedisKeyExpirationListerner(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
/**
* 使用该方法监听 ,当我们的key失效的时候执行改方法
*/
@Override
public void onMessage(Message message, byte[] pattern) {
String keyExpira = message.toString();
System.out.println("keyExpira======>>>>>>"+keyExpira);
//拿到过期key ,处理业务逻辑
}
}
4.测试回调 ,开启redis客户端 存值设置超时时间2秒
4.