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 27 Redis
详解Redis实现限流的三种方式
Apr 27 Redis
redis内存空间效率问题的深入探究
May 17 Redis
详解Redis主从复制实践
May 19 Redis
使用Redis实现实时排行榜功能
Jul 02 Redis
在redisCluster中模糊获取key方式
Jul 09 Redis
Redis字典实现、Hash键冲突及渐进式rehash详解
Sep 04 Redis
分布式Redis Cluster集群搭建与Redis基本用法
Feb 24 Redis
Redis高可用集群redis-cluster详解
Mar 20 Redis
Redis实现一个账号只能登录一个设备
Apr 19 Redis
Redis 报错 error:NOAUTH Authentication required
May 15 Redis
如何使用注解方式实现 Redis 分布式锁
Jul 23 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
使用PHP模拟HTTP认证
2006/10/09 PHP
php时间戳格式化显示友好的时间函数分享
2014/10/21 PHP
javascript检查日期格式的函数[比较全]
2008/10/17 Javascript
javascript 操作select下拉列表框的一点小经验
2010/03/20 Javascript
jQuery)扩展jQuery系列之一 模拟alert,confirm(一)
2010/12/04 Javascript
jquery获取被勾选的checked(选中)的那一行的3列和4列的值
2013/07/04 Javascript
使用jQuery避免鼠标双击的解决方案
2013/08/21 Javascript
后台获取ZTREE选中节点的方法
2015/02/12 Javascript
javascript 用函数实现继承详解
2016/05/28 Javascript
jQuery 出现Cannot read property ‘msie’ of undefined错误的解决方法
2016/11/23 Javascript
浅谈Nodejs中的作用域问题
2016/12/26 NodeJs
jQuery的ajax中使用FormData实现页面无刷新上传功能
2017/01/16 Javascript
angular.js实现购物车功能
2017/10/23 Javascript
详解如何使用 vue-cli 开发多页应用
2017/12/16 Javascript
使用百度地图实现地图网格的示例
2018/02/06 Javascript
如何用input标签和jquery实现多图片的上传和回显功能
2018/05/16 jQuery
HTML+JavaScript实现扫雷小游戏
2019/09/30 Javascript
封装 axios+promise通用请求函数操作
2020/08/11 Javascript
js实现删除json中指定的元素
2020/09/22 Javascript
如何将python中的List转化成dictionary
2016/08/15 Python
Python网络爬虫项目:内容提取器的定义
2016/10/25 Python
PyTorch中的C++扩展实现
2020/04/02 Python
python按照list中字典的某key去重的示例代码
2020/10/13 Python
HTML5新增form控件和表单属性实例代码详解
2019/05/15 HTML / CSS
雅诗兰黛旗下走天然植物路线的彩妆品牌:Prescriptives
2016/08/14 全球购物
聪明的粉丝购买门票的地方:TickPick
2018/03/09 全球购物
意大利运动服减价商店:ScontoSport
2020/03/10 全球购物
网上常见的一份Linux面试题(多项选择部分)
2015/02/07 面试题
12月红领巾广播稿
2014/02/13 职场文书
农民工工资支付承诺函
2014/03/31 职场文书
小学二年级学生评语
2014/04/21 职场文书
暑期培训班策划方案
2014/08/26 职场文书
加强干部作风建设整改方案
2014/10/24 职场文书
2015年乡镇民政工作总结
2015/05/13 职场文书
新员工实习期个人工作总结
2015/10/15 职场文书
python中subplot大小的设置步骤
2021/06/28 Python