利用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

评论