Redis key过期事件监听实现 - 30分钟自动取消未支付订单

一、前言

前段时间一个朋友问:让实现一个30分钟如果订单未支付,系统自动取消订单的功能需求,当时巴拉巴拉给他说了几种方案;

那么,今天着重挑选一种通用、效率高的方案给大家讲解一下;

Demo源码地址详见:《Alipay_demo》 下载即可使用

好文章 记得收藏+点赞+关注额 !!!

---- Nick.Peng


二、实现方案分析

  • 方案1:统一的定时任务,每隔1分钟轮询执行,来处理订单

    缺点: 一听到轮询,肯定是不建议大家使用的,每隔一分钟处理一次,过于频繁的请求,增加服务器的负担。并且会有1分钟的误差,因为定时任务设置每隔1分钟执行一次。
    优点: 实现简单

  • 方案2:利用mq的延迟发送特性处理 + 定时任务

    下单后,发送一条消息给mq,并设置mq,30分钟后再处理发送消息动作
    优点: 时间准确性相对高,一个单子只执行一次,并发高。
    缺点:
            1、当大量消息堆积的时候,同样存在延迟的问题。同时还可能存在消息丢失风险。(rocketmq号称0丢失)
            2、基本上mq,都是默认不开启延迟发送的,需要开启mq延迟发送功能,且会增加mq的一部分性能负担。

  • 方案3:利用redis的过期key特性处理

    优点: 时间准确性相对高,一个单子只执行一次,过期key到期自动消失。
    缺点:
            1、消息只发送一次,不管有没有处理成功。
            2、当很多key同时过期时,存在延迟问题。
            3、redis默认是不开启这个功能的,需要开启redis过期key的监听订阅,会增加redis的一部分性能负担。

  • 方案4:写一套30分钟后处理的定时任务

    当下单后,新建一个30分钟后处理的定时任务
    优点: 时间准确性高,一个单子只执行一次。(可以使用Apscheduler定时框架+redis)
    缺点: 需要频繁新建定时任务,并且需要删除处理过无用的定时任务。

  • 方案5:在订单列表视图中实现一套30分钟取消订单的逻辑

三、Redis key过期事件方案实现步骤

Re:
        Redis 自2.8.0之后版本提供了 Keyspace Notifications 功能,允许客户订阅 Pub / Sub 频道,以便以某种方式接收影响 Redis 数据集的事件。

3.1 Redis 安装步骤详见
3.2 修改 Redis 配置
  • 找到 redis.conf 配置文件,一般在/etc/redis/redis.conf,可以通过以下方式查看:
    在这里插入图片描述
  • 修改 Redis 配置文件,找到notify-keyspace-events Ex,默认是被注释的,打开注释,并将下面的 notify-keyspace-events ""加上注释即可
    在这里插入图片描述
    # =
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值