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 08 Redis
Windows下redis下载、redis安装及使用教程
Jun 02 Redis
redis使用不当导致应用卡死bug的过程解析
Jul 01 Redis
Redis字典实现、Hash键冲突及渐进式rehash详解
Sep 04 Redis
Redis RDB技术底层原理详解
Sep 04 Redis
SpringBoot集成Redis的思路详解
Oct 16 Redis
SpringBoot整合Redis入门之缓存数据的方法
Nov 17 Redis
Redis全局ID生成器的实现
Jun 05 Redis
Redis实现主从复制方式(Master&Slave)
Jun 21 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 实现多服务器共享 SESSION 数据
2009/08/15 PHP
PHP 加密解密内部算法
2010/04/22 PHP
php数据库密码的找回的步骤
2011/01/12 PHP
PHP生成自定义长度随机字符串的函数分享
2014/05/04 PHP
PHP判断一个数组是另一个数组子集的方法详解
2017/07/31 PHP
PHP底层运行机制与工作原理详解
2020/07/31 PHP
PHP7 windows支持
2021/03/09 PHP
深入理解JavaScript系列(13) This? Yes,this!
2012/01/18 Javascript
javaScript NameSpace 简单说明介绍
2013/07/18 Javascript
js hover 定时器(实例代码)
2013/11/12 Javascript
网站接入QQ登录的两种方法
2014/07/22 Javascript
js+css实现select的美化效果
2016/03/24 Javascript
浅析js绑定事件的常用方法
2016/05/15 Javascript
JS中递归函数
2016/06/17 Javascript
js轮播图无缝滚动效果
2017/06/17 Javascript
原生JS实现轮播图效果
2018/10/12 Javascript
vue中img src 动态加载本地json的图片路径写法
2019/04/25 Javascript
nodejs对项目下所有空文件夹创建gitkeep的方法
2019/08/02 NodeJs
layui表格 返回的数据状态异常的解决方法
2019/09/10 Javascript
uni app仿微信顶部导航条功能
2019/09/17 Javascript
SSM+layUI 根据登录信息显示不同的页面方法
2019/09/20 Javascript
Python实现简单截取中文字符串的方法
2015/06/15 Python
Python在图片中添加文字的两种方法
2017/04/29 Python
基于python进行桶排序与基数排序的总结
2018/05/29 Python
Django缓存系统实现过程解析
2019/08/02 Python
python实现大量图片重命名
2020/03/23 Python
keras和tensorflow使用fit_generator 批次训练操作
2020/07/03 Python
德国大型的家具商店:Pharao24.de
2016/10/02 全球购物
如果NULL定义成#define NULL((char *)0)难道不就可以向函数传入不加转换的NULL了吗
2012/02/15 面试题
《彭德怀和他的大黑骡子》教学反思
2014/04/12 职场文书
班干部竞选演讲稿
2014/04/24 职场文书
环保标语口号
2014/06/13 职场文书
2014年保安个人工作总结
2014/11/13 职场文书
2015年中秋节主持词
2015/07/30 职场文书
2016企业先进集体事迹材料
2016/02/25 职场文书
Python机器学习之PCA降维算法详解
2021/05/19 Python