Redis实现订单过期删除的方法步骤


Posted in Redis onJune 05, 2022

前言

设计订单过期,不能单纯靠Redis,需要兜底策略

代码实现:

import com.coolplay.trade.dto.req.CancelOrderReq;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Set;
import java.util.concurrent.TimeUnit;


@Service
@Slf4j
public class OrderRedisDelayQueueOperator extends AbstractOrderScheduleDelayQueue {
    @Resource(name = "redisTemplate")
    private ZSetOperations<String, String> orderRedis;

    /**
     * 预售、现货生成订单15分钟后未支付,需要取消订单
     */
    private static final String DELAY_QUEUE_NAME = "order";

    /**
     * 每1秒执行一次
     */
    @Override
    @Scheduled(cron = "0/1 * * * * ? ")
    public void orderEventProcess() {
        if (!redisLock.tryLock(this.getClass().getSimpleName(), TimeUnit.MILLISECONDS, 10, 100)) {
            return;
        }
        Set<String> dq = orderRedis.range(DELAY_QUEUE_NAME, 0L, Long.MAX_VALUE);
        if (CollectionUtils.isEmpty(dq)) {
            return;
        }
        for (String orderNo : dq) {
            Double xs = orderRedis.score(DELAY_QUEUE_NAME, orderNo);
            Double now = System.currentTimeMillis() * 1.0;
            if (xs <= now) {
                log.info("{} timed out", orderNo);
                super.threadPoolTaskExecutor.execute(() -> {
                    CancelOrderReq req = new CancelOrderReq();
                    req.setOrderNo(orderNo);
                    req.setCancelType(OrderActionEnum.TIME_OUT_CANCEL);
                    orderService.cancelOrder(req);
                });
            } else {
                //log.info("{} no time out", orderNo);
                //如果最小的都没有过期,剩余的则不用处理了
                break;
            }
        }
    }


    public void addToRedis(String orderNo, long delayTime) {
        orderRedis.add(DELAY_QUEUE_NAME, orderNo, delayTime * 1.0);

    }

    public void removeFromRedis(String orderNo) {

        orderRedis.remove(DELAY_QUEUE_NAME, orderNo);
    }
}

兜底策略

/**
     * 取消订单--10分钟--20分钟执行一次
     */
    @XxlJob("cancelOrder20Minutes")
    public void cancelOrderTenMinutes() {
        log.info("*****[开始:下单十分钟以后系统自动取消订单]*****");
        Date start = DateUtil.dateRoll(new Date(), Calendar.MINUTE,-20);
        Date end = new Date();
       List<ClOrder> clorderList =clOrderMapper.selectListAllOrdrWaiting(start,end);
       if(ObjectUtil.isNotEmpty(clorderList)){
           for(int i=0;i<clorderList.size();i++){
               ClOrder clOrder = clorderList.get(i);
               if(ObjectUtil.isNotEmpty(clOrder)){
                   Date orderTime = clOrder.getOrderTime();
                   long between = cn.hutool.core.date.DateUtil.between(orderTime, new Date(), DateUnit.MINUTE);
                   if(between>10){
                       ClOrder clOrderTemp = new ClOrder();
                       clOrderTemp.setOrderState("3");
                       clOrderTemp.setId(clOrder.getId());
                       clOrderTemp.setMemberId(clOrder.getMemberId());
                       String msg="您的订单已经取消,订单金额已发放至您的账户请查收~";
                       try {
                           boolean b = orderService.cancelOrder(clOrderTemp,msg);
                           if(!b){
                               log.info("[订单失效:定时任务兜底策略更新失败]**订单ID: {}",clOrderTemp.getId());
                           }
                           log.info("[Redis订单取消订单失效,定时任务兜底策略生效]");
                       }catch (Exception e){
                           log.info("[订单失效:定时任务兜底策略更新失败]**订单ID: {}",clOrderTemp.getId());
                           e.printStackTrace();
                       }


                   }
               }
           }
       }
        log.info("*****[结束:下单十分钟以后系统自动取消订单]*****");
    }

到此这篇关于Redis实现订单过期删除的方法步骤的文章就介绍到这了,更多相关Redis 订单过期删除内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Redis 相关文章推荐
redis限流的实际应用
Apr 24 Redis
浅谈Redis主从复制以及主从复制原理
May 29 Redis
Windows中Redis安装配置流程并实现远程访问功能
Jun 07 Redis
Redis的字符串是如何实现的
Oct 24 Redis
SpringBoot整合Redis入门之缓存数据的方法
Nov 17 Redis
在Centos 8.0中安装Redis服务器的教程详解
Mar 21 Redis
Redis官方可视化工具RedisInsight安装使用教程
Apr 19 Redis
muduo TcpServer模块源码分析
Apr 26 Redis
Redis 限流器
May 15 Redis
Redis实现订单过期删除的方法步骤
Jun 05 Redis
Redis+AOP+自定义注解实现限流
Jun 28 Redis
redis protocol通信协议及使用详解
Jul 15 Redis
浅谈Redis缓冲区机制
Redis全局ID生成器的实现
Jun 05 #Redis
Redis keys命令的具体使用
Jun 05 #Redis
Redis入门基础常用操作命令整理
Jun 01 #Redis
Redis基本数据类型String常用操作命令
Jun 01 #Redis
Redis基本数据类型List常用操作命令
Jun 01 #Redis
Redis基本数据类型Set常用操作命令
Jun 01 #Redis
You might like
浅析HTTP消息头网页缓存控制以及header常用指令介绍
2013/06/28 PHP
PHP开发注意事项总结
2015/02/04 PHP
浅谈PHP中其他类型转化为Bool类型
2016/03/28 PHP
支付宝支付开发――当面付条码支付和扫码支付实例
2016/11/04 PHP
Laravel 加载第三方类库的方法
2018/04/20 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
jquery ui resizable bug解决方法
2010/10/26 Javascript
Google Dart编程语法和基本类型学习教程
2013/11/27 Javascript
Node.js实现简单聊天服务器
2014/06/20 Javascript
Javascript 运动中Offset的bug解决方案
2014/12/24 Javascript
JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】
2016/05/10 Javascript
Angularjs之filter过滤器(推荐)
2016/11/27 Javascript
vue-cli之router基本使用方法详解
2017/10/17 Javascript
用React-Native+Mobx做一个迷你水果商城APP(附源码)
2017/12/25 Javascript
vue中各选项及钩子函数执行顺序详解
2018/08/25 Javascript
vue 优化CDN加速的方法示例
2018/09/19 Javascript
原生javascript单例模式的应用实例分析
2020/02/23 Javascript
Node.js API详解之 timer模块用法实例分析
2020/05/07 Javascript
Javascript新手入门之字符串拼接与变量的应用
2020/12/03 Javascript
使用python实现正则匹配检索远端FTP目录下的文件
2015/03/25 Python
Python使用redis pool的一种单例实现方式
2016/04/16 Python
Python for Informatics 第11章之正则表达式(二)
2016/04/21 Python
Python IDLE入门简介
2017/12/08 Python
python语言中with as的用法使用详解
2018/02/23 Python
python 解决动态的定义变量名,并给其赋值的方法(大数据处理)
2018/11/10 Python
用python脚本24小时刷浏览器的访问量方法
2018/12/07 Python
python绘制评估优化算法性能的测试函数
2019/06/25 Python
python IDLE 背景以及字体大小的修改方法
2019/07/12 Python
Django框架ORM数据库操作实例详解
2019/11/07 Python
python的json包位置及用法总结
2020/06/21 Python
求职信模板标准格式范文
2014/02/23 职场文书
入党积极分子评语
2014/05/04 职场文书
事业单位个人查摆问题及整改措施
2014/10/28 职场文书
电影小兵张嘎观后感
2015/06/03 职场文书
python文件名批量重命名脚本实例代码
2021/04/22 Python
Win10/Win11 任务栏替换成经典样式
2022/04/19 数码科技