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
SpringBoot 集成Redis 过程
Jun 02 Redis
Redis可视化客户端小结
Jun 10 Redis
k8s部署redis cluster集群的实现
Jun 24 Redis
关于redisson缓存序列化几枚大坑说明
Aug 04 Redis
Redis字典实现、Hash键冲突及渐进式rehash详解
Sep 04 Redis
sentinel支持的redis高可用集群配置详解
Apr 01 Redis
使用Redis做预定库存缓存功能
Apr 02 Redis
Redis实现一个账号只能登录一个设备
Apr 19 Redis
Grafana可视化监控系统结合SpringBoot使用
Apr 19 Redis
解决 redis 无法远程连接
May 15 Redis
Redis基本数据类型Zset有序集合常用操作
Jun 01 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
sourcesafe管理phpproj文件的补充说明(downmoon)
2009/04/11 PHP
在PHP中使用curl_init函数的说明
2010/11/02 PHP
php ImageMagick windows下安装教程
2015/01/26 PHP
php利用嵌套数组拼接与解析json的方法
2017/02/07 PHP
PHP+jQuery实现即点即改功能示例
2019/02/21 PHP
动态创建的表格单元格中的事件实现代码
2008/12/30 Javascript
JavaScript高级程序设计 客户端存储学习笔记
2011/09/10 Javascript
JS中setInterval、setTimeout不能传递带参数的函数的解决方案
2013/04/28 Javascript
JS可以控制样式的名称写法一览
2014/01/16 Javascript
使用jQuery动态加载js脚本文件的方法
2014/04/03 Javascript
浅谈javascript的Array.prototype.slice.call
2015/08/31 Javascript
JS中的forEach、$.each、map方法推荐
2016/04/05 Javascript
正则表达式(语法篇推荐)
2016/06/24 Javascript
浅谈js键盘事件全面控制
2016/12/01 Javascript
浅析vue component 组件使用
2017/03/06 Javascript
JS实现的数组去除重复数据算法小结
2017/11/17 Javascript
vue+element-ui+ajax实现一个表格的实例
2018/03/09 Javascript
微信小程序实现左滑修改、删除功能
2020/10/19 Javascript
electron + vue项目实现打印小票功能及实现代码
2018/11/25 Javascript
mockjs+vue页面直接展示数据的方法
2018/12/19 Javascript
JavaScript前后端JSON使用方法教程
2020/11/23 Javascript
[03:39]DOTA2英雄梦之声_第05期_幽鬼
2014/06/23 DOTA
python中使用OpenCV进行人脸检测的例子
2014/04/18 Python
python模块之time模块(实例讲解)
2017/09/13 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
2019/09/10 Python
python通过文本在一个图中画多条线的实例
2020/02/21 Python
Python的信号库Blinker用法详解
2020/12/31 Python
CSS实现圆形放大镜狙击镜效果 只有圆圈里的放大
2012/12/10 HTML / CSS
计算机专业毕业生推荐信
2013/11/25 职场文书
中专生的个人自我评价
2013/12/11 职场文书
科研课题实施方案
2014/03/18 职场文书
调解协议书
2014/04/16 职场文书
单位病假条范文
2015/08/17 职场文书
小学生大队委竞选稿
2015/11/20 职场文书
小学中队委竞选稿
2015/11/20 职场文书
oracle重置序列从0开始递增1
2022/02/28 Oracle