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存储数据类型及存取值方法
May 08 Redis
厉害!这是Redis可视化工具最全的横向评测
Jul 15 Redis
解析redis hash应用场景和常用命令
Aug 04 Redis
Redis如何实现分布式锁
Aug 23 Redis
Redis RDB技术底层原理详解
Sep 04 Redis
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
Feb 12 Redis
Redis监控工具RedisInsight安装与使用
Mar 21 Redis
解决redis批量删除key值的问题
Mar 23 Redis
redis sentinel监控高可用集群实现的配置步骤
Apr 01 Redis
 Redis 串行生成顺序编码的方法实现
Apr 03 Redis
解决 Redis 秒杀超卖场景的高并发
Apr 12 Redis
redis lua限流算法实现示例
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
PHP 获取MySQL数据库里所有表的实现代码
2011/07/13 PHP
PHP实现UTF-8文件BOM自动检测与移除实例
2014/11/05 PHP
PHP抓取网页、解析HTML常用的方法总结
2015/07/01 PHP
php获取从百度、谷歌等搜索引擎进入网站关键词的方法
2015/07/08 PHP
windows下apache搭建php开发环境
2015/08/27 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
JavaScript脚本语言在网页中的简单应用
2007/05/13 Javascript
Jquery + Ajax调用webService实例代码(asp.net)
2010/08/27 Javascript
浅析jquery的js图表组件highcharts
2014/03/06 Javascript
Node.js中AES加密和其它语言不一致问题解决办法
2014/03/10 Javascript
使用EVAL处理jqchart jquery 折线图返回数据无效的解决办法
2015/11/26 Javascript
你所未知的3种Node.js代码优化方式
2016/02/25 Javascript
基于jquery实现即时检查格式是否正确的表单
2016/05/06 Javascript
Vue.js每天必学之过滤器与自定义过滤器
2016/09/07 Javascript
bootstrap监听滚动实现头部跟随滚动
2016/11/08 Javascript
AngularJs表单验证实例代码解析
2016/11/29 Javascript
浅谈jQuery before和insertBefore的区别
2016/12/04 Javascript
jquery+html仿翻页相册功能
2016/12/20 Javascript
webpack学习教程之publicPath路径问题详解
2017/06/17 Javascript
解决vue处理axios post请求传参的问题
2018/03/05 Javascript
详解小程序如何动态绑定点击的执行方法
2019/11/26 Javascript
用Python编写简单的定时器的方法
2015/05/02 Python
在Python中操作文件之read()方法的使用教程
2015/05/24 Python
Python爬虫框架Scrapy实战之批量抓取招聘信息
2015/08/07 Python
利用Python实现颜色色值转换的小工具
2016/10/27 Python
在IPython中执行Python程序文件的示例
2018/11/01 Python
Python 确定多项式拟合/回归的阶数实例
2018/12/29 Python
python框架django项目部署相关知识详解
2019/11/04 Python
python使用梯度下降算法实现一个多线性回归
2020/03/24 Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
2020/11/01 Python
amazeui页面校验功能的实现代码
2020/08/24 HTML / CSS
旅游管理毕业生自荐信
2013/11/05 职场文书
离职证明标准格式
2014/09/15 职场文书
第28个世界无烟日活动总结
2015/02/10 职场文书
Python文件的操作示例的详细讲解
2021/04/08 Python
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android