利用redis过期机制实现订单超时功能

以前记录过使用 RabbitMQ 的死信队列 实现订单超时的功能,但实现的还是比较复杂,还要安装RabbitMQ,使用线程记录又太占用服务器资源,这里记录一下如何使用Redis来实现超时功能

解决方案

利用redis中key自动过期的机制,在订单提交的时候设置过期时间并写入redis

并监听获取过期key,通过key值判断是否为订单的key值并修改订单状态

代码

​添加到redis的代码暂时先不写了,格式 key值格式为 order:订单号 或者 order:订单主键就好了

监听redis过期事件
/**
 * redis配置
 */
@Configuration
public class RedisListenerConfig {

    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        return container;
    }

}
/**
 * 监听redis过期事件
 */
@Slf4j
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {

    public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }


    /**
     * 针对redis数据失效事件,进行数据处理
     * @param message
     * @param pattern
     */
    @Override
    public void onMessage(Message message, byte[] pattern) {
        try {
            String key = message.toString();
            //从失效key中筛选代表订单失效的key
            System.out.println(key);
            if (key != null && key.startsWith("order:")) {
                String orderNo = key.substring(6);
                log.info("订单超时,订单号为: " + orderNo);
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error("修改支付订单过期状态异常: " + e.getMessage());
        }
    }
}

这个就是简单的订单超时功能的实现

参考链接: https://zhuanlan.zhihu.com/p/193056589


利用redis过期机制实现订单超时功能
https://guiyunweb.com/archives/%E5%88%A9%E7%94%A8redis%E8%BF%87%E6%9C%9F%E7%9A%84%E6%9C%BA%E5%88%B6%E5%AE%9E%E7%8E%B0%E8%AE%A2%E5%8D%95%E8%B6%85%E6%97%B6%E5%8A%9F%E8%83%BD
作者
归云
发布于
2021年02月18日
更新于
2024年06月18日
许可协议