• SpringBoot + Redis 实现订单30分钟不支付自动取消


    修改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,不然会出现支付成功或者取消订单后还是超时未支付的情况

  • 相关阅读:
    阅读笔记十四
    惨淡的蓝桥杯国赛经历
    阅读笔记十三
    阅读笔记十二
    阅读笔记十一
    阅读笔记十
    阅读笔记九
    阅读笔记八
    阅读笔记七
    阅读笔记六
  • 原文地址:https://www.cnblogs.com/yangwanhao/p/12638410.html
Copyright © 2020-2023  润新知