利用Redis实现付款倒计时

打印 上一主题 下一主题

主题 984|帖子 984|积分 2952

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、前言

   文本源自 微博客 且已获授权,请恭敬知识产权。
       公司项目最近在做一个生意业务体系,需要实现用户下订单以后一定时间内,不付款自动取消该订单,这种功能也是涉及到生意业务的体系很常见的需求,那么应该怎样实现呢?
二、思绪

     为了实现上述需求,我们可以使用Redis的订阅功能,在用户创建订单的时间,生存订单信息、设置逾期时间,而且订阅该缓存信息;在这段逾期时间期间内,如果用户付款,那么就删除该缓存信息,否则等到缓存逾期时,取消该订单。详细实现如下:
三、详细实现

3.1 设置缓存

  1.    //订单倒计时开始  ORDER_INFO_COUNTDOWN 是一个字符串变量
  2.     redisCache.setCacheObject(ORDER_INFO_COUNTDOWN + order.getId(), "pending", 30, TimeUnit.MINUTES);
复制代码
3.2 订阅失效变乱

  1. import com.acceptance.business.service.IAccOrderInfoService;
  2. import lombok.RequiredArgsConstructor;
  3. import lombok.extern.log4j.Log4j2;
  4. import org.springframework.data.redis.connection.Message;
  5. import org.springframework.data.redis.connection.MessageListener;
  6. import org.springframework.data.redis.core.RedisTemplate;
  7. import org.springframework.stereotype.Component;
  8. import javax.annotation.PostConstruct;
  9. import java.util.Objects;
  10. import static com.acceptance.common.constant.CacheConstants.ORDER_INFO_COUNTDOWN;
  11. @Log4j2
  12. @Component
  13. @RequiredArgsConstructor
  14. public class OrderExpirationListener implements MessageListener {
  15.     private final RedisTemplate<Object, Object> redisTemplate;
  16.     private final IOrderInfoService orderService;
  17.     @PostConstruct
  18.     public void init() {
  19.         // 订阅键过期事件
  20.         Objects.requireNonNull(redisTemplate.getConnectionFactory())
  21.                 .getConnection()
  22.                 .pSubscribe(this, "__keyevent@*__:expired".getBytes());
  23.     }
  24.     @Override
  25.     public void onMessage(Message message, byte[] pattern) {
  26.         // 将消息体从字节数组转换为字符串
  27.         String channel = new String(message.getChannel());
  28.         String expiredKey = new String(message.getBody());
  29.         if (!(channel.startsWith("__keyevent@") && channel.endsWith(":expired"))) {
  30.             return;
  31.         }
  32.         // 检查频道名称是否符合预期
  33.         if (!expiredKey.startsWith(ORDER_INFO_COUNTDOWN)) {
  34.             return;
  35.         }
  36.         // 处理订单过期逻辑
  37.         long orderId = Long.parseLong(expiredKey.split(":")[1]);
  38.         log.info("监听到有未付款订单,准备自动取消....,id为:{}", orderId);
  39.         orderService.autoCancel(orderId, "过期未付款,系统自动取消");
  40.         //确保下次不会重复执行
  41.         redisTemplate.delete(ORDER_INFO_COUNTDOWN + orderId);
  42.     }
  43. }
复制代码
     如果在这期间,用户对该订单付款,那么删除该缓存就好,颠末上述步骤,即可实现订单倒计时功能,也是最简单的实现方法。
     PS:为了实现订阅redis失效变乱,还需要对redis进行设置:
登录redis-cli以后,执行以下命令:CONFIG SET notify-keyspace-events Ex

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

千千梦丶琪

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表