修改 Redis 的 Redis.conf 文件
找到 notify-keyspace-events Ex 这一行 取消行前边的注释 开启键空间失效通知
在 SpringBoot 项目的 pom.xml 中导入依赖
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-Redis</artifactId>
- </dependency>
在项目中新建 Listener 并继承自 KeyExpirationEventMessageListener
- @Component
- @Slf4j
- public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
- @Autowired
- private OrderService orderService;
- public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
- super(listenerContainer);
- }
- @Override
- public void onMessage(Message message, byte[] pattern) {
- // 用户做自己的业务处理即可, 注意 message.toString() 可以获取失效的 key
- String expiredKey = message.toString();
- log.info("------------------redis key 失效; key =" + expiredKey);
- if (expiredKey.startsWith(GlobalConstant.RedisPrefixKey.ORDER_PREFIX)) {
- // 获取订单 orderNO
- String orderNo = expiredKey.substring(expiredKey.lastIndexOf(":")+1);
- // 将待支付的订单改为已取消 (超时未支付)
- orderService.orderPaidTimeout(orderNo);
- }
- }
- }
新建配置类
- @Configuration
- public class RedisListenerConfig {
- @Bean
- RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
- RedisMessageListenerContainer container = new RedisMessageListenerContainer();
- container.setConnectionFactory(connectionFactory);
- return container;
- }
- }
在生成订单的时候要将 orderNo 作为 key 放入 Redis, 设置失效时长为 30 分钟
在订单支付成功后删除 Redis 中的 key, 不然会出现支付成功候还是被取消的情况
来源: http://www.bubuko.com/infodetail-3493546.html