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 相关文章推荐
Redis5之后版本的高可用集群搭建的实现
Apr 27 Redis
springboot使用Redis作缓存使用入门教程
Jul 25 Redis
Redis分布式锁Redlock的实现
Aug 07 Redis
详解redis在微服务领域的贡献
Oct 16 Redis
Redis 持久化 RDB 与 AOF的执行过程
Nov 07 Redis
Springboot/Springcloud项目集成redis进行存取的过程解析
Dec 04 Redis
Redis分布式锁的7种实现
Apr 01 Redis
Redis官方可视化工具RedisInsight安装使用教程
Apr 19 Redis
Redis数据同步之redis shake的实现方法
Apr 21 Redis
Redis基本数据类型List常用操作命令
Jun 01 Redis
Redis实现订单过期删除的方法步骤
Jun 05 Redis
利用Redis实现点赞功能的示例代码
Jun 28 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压缩多个CSS为一个css的代码并缓存
2011/04/21 PHP
php采集内容中带有图片地址的远程图片并保存的方法
2015/01/03 PHP
详解PHP实现执行定时任务
2015/12/21 PHP
yii用户注册表单验证实例
2015/12/26 PHP
浅谈php数组array_change_key_case() 函数和array_chunk()函数
2016/10/22 PHP
PHP提取字符串中的手机号正则表达式怎么写
2017/07/17 PHP
简单通用的JS滑动门代码
2008/12/19 Javascript
javascript 表单验证常见正则
2009/09/28 Javascript
js调用AJAX时Get和post的乱码解决方法
2013/06/04 Javascript
使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目
2016/02/15 Javascript
JavaScript File分段上传
2016/03/10 Javascript
自动化测试读写64位操作系统的注册表
2016/08/15 Javascript
js实现将json数组显示前台table中
2017/01/10 Javascript
详解vue-cli开发环境跨域问题解决方案
2017/06/06 Javascript
使用jQuery实现动态添加小广告
2017/07/11 jQuery
angularjs实现过滤并替换关键字小功能
2017/09/19 Javascript
Vue组件中prop属性使用说明实例代码详解
2018/05/31 Javascript
vue弹窗插件实战代码
2018/09/08 Javascript
Angular中innerHTML标签的样式不起作用的原因解析
2019/06/18 Javascript
vue 导航内容设置选中状态样式的例子
2019/11/01 Javascript
JavaScript forEach中return失效问题解决方案
2020/06/01 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
2020/07/26 Javascript
Python的爬虫框架scrapy用21行代码写一个爬虫
2017/04/24 Python
python高效过滤出文件夹下指定文件名结尾的文件实例
2018/10/21 Python
pyenv与virtualenv安装实现python多版本多项目管理
2019/08/17 Python
python保留格式汇总各部门excel内容的实现思路
2020/06/01 Python
Python程序慢的重要原因
2020/09/04 Python
利用html5 canvas破解简单验证码及getImageData接口应用
2013/01/25 HTML / CSS
Aquatalia官网:意大利著名鞋履品牌
2019/09/26 全球购物
英国Radley包德国官网:Radley London德国
2019/11/18 全球购物
党员入党表决心的话
2014/03/11 职场文书
计生专干事迹
2014/05/28 职场文书
见习报告的格式
2014/11/04 职场文书
2015大学生自我评价范文
2015/03/03 职场文书
岁月神偷观后感
2015/06/11 职场文书
Python学习之异常中的finally使用详解
2022/03/16 Python