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 12 Redis
Redis数据结构之链表与字典的使用
May 11 Redis
Windows下redis下载、redis安装及使用教程
Jun 02 Redis
redis实现的四种常见限流策略
Jun 18 Redis
redis缓存存储Session原理机制
Nov 20 Redis
面试分析分布式架构Redis热点key大Value解决方案
Mar 13 Redis
redis复制有可能碰到的问题汇总
Apr 03 Redis
Redis如何实现验证码发送 以及限制每日发送次数
Apr 18 Redis
解决 redis 无法远程连接
May 15 Redis
Redis基本数据类型Set常用操作命令
Jun 01 Redis
python中使用redis用法详解
Dec 24 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
JS实现php的伪分页
2008/05/25 PHP
php替换超长文本中的特殊字符的函数代码
2012/05/22 PHP
PHP排序算法之简单选择排序(Simple Selection Sort)实例分析
2018/04/20 PHP
通过Jscript中@cc_on 语句识别IE浏览器及版本的代码
2011/05/07 Javascript
javascript的offset、client、scroll使用方法详解
2012/12/25 Javascript
js 有框架页面跳转(target)三种情况下的应用
2013/04/09 Javascript
js的image onload事件使用遇到的问题
2014/07/15 Javascript
jQuery实现网页抖动的菜单抖动效果
2015/08/07 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
2015/08/21 Javascript
基于jQuery倾斜打开侧边栏菜单特效代码
2015/09/15 Javascript
浅析jQuery事件之on()方法绑定多个选择器,多个事件
2016/04/27 Javascript
node.js中 stream使用教程
2016/08/28 Javascript
JS实现“隐藏与显示”功能(多种方法)
2016/11/24 Javascript
Node.js  REPL (交互式解释器)实例详解
2017/08/06 Javascript
分分钟学会vue中vuex的应用(入门教程)
2017/09/14 Javascript
原生JS实现小小的音乐播放器
2017/10/16 Javascript
Bootstrap Table列宽拖动的方法
2018/08/15 Javascript
js实现简单模态框实例
2018/11/16 Javascript
Vue项目前后端联调(使用proxyTable实现跨域方式)
2020/07/18 Javascript
javascript实现简易计算器功能
2020/09/23 Javascript
[54:43]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第一场 2月22日
2021/03/11 DOTA
python读取csv文件示例(python操作csv)
2014/03/11 Python
Python 'takes exactly 1 argument (2 given)' Python error
2016/12/13 Python
python3下使用cv2.imwrite存储带有中文路径图片的方法
2018/05/10 Python
python入门之基础语法学习笔记
2020/02/08 Python
初学者学习Python好还是Java好
2020/05/26 Python
CSS3圆角边框和边界图片效果实例
2016/07/01 HTML / CSS
基于HTML5 FileSystem API的使用介绍
2013/04/24 HTML / CSS
玩具反斗城天猫官方旗舰店:享誉全球的玩具店
2017/10/10 全球购物
英国浴室洗脸盆购物网站:Click Basin
2018/06/08 全球购物
全球独特生活方式产品和礼品购物网站:AHAlife
2018/09/18 全球购物
初婚未育证明
2014/01/15 职场文书
党日活动总结
2014/05/07 职场文书
个人房屋转让协议书范本
2014/10/26 职场文书
幼儿园2014年度工作总结
2014/11/10 职场文书
Apache Pulsar集群搭建部署详细过程
2022/02/12 Servers