zoukankan      html  css  js  c++  java
  • 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,不然会出现支付成功或者取消订单后还是超时未支付的情况

  • 相关阅读:
    lunix下的redis数据库操作——set集合
    lunix下的redis数据库操作——hash(哈希)
    lunix下的redis数据库操作——list列表
    python操作mysql
    linux修改mysql表结构
    关于wordclou的一些简单操作
    SQL NOW() 函数:返回当前系统的日期和时间
    SQL ROUND() 函数:把数值字段四舍五入为指定的小数位数
    SQL LEN() 函数:返回文本字段中值的长度
    SQL MID() 函数:从文本字段中提取字符
  • 原文地址:https://www.cnblogs.com/yangwanhao/p/12638410.html
Copyright © 2011-2022 走看看