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,不然會出現支付成功或者取消訂單后還是超時未支付的情況


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM