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
在K8s上部署Redis集群的方法步骤
Apr 27 Redis
redis 限制内存使用大小的实现
May 08 Redis
为Java项目添加Redis缓存的方法
May 18 Redis
详解redis分布式锁的这些坑
May 19 Redis
Windows中Redis安装配置流程并实现远程访问功能
Jun 07 Redis
Redis可视化客户端小结
Jun 10 Redis
redis requires ruby version2.2.2的解决方案
Jul 15 Redis
使用RedisTemplat实现简单的分布式锁
Nov 20 Redis
Springboot/Springcloud项目集成redis进行存取的过程解析
Dec 04 Redis
Redis基本数据类型Set常用操作命令
Jun 01 Redis
Redis实现主从复制方式(Master&Slave)
Jun 21 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压缩HTML函数轻松实现压缩html/js/Css及注意事项
2013/01/27 PHP
解析左右值无限分类的实现算法
2013/06/20 PHP
php函数式编程简单示例
2019/08/08 PHP
JS 参数传递的实际应用代码分析
2009/09/13 Javascript
javascript利用初始化数据装配模版的实现代码
2010/11/17 Javascript
JavaScript和CSS通过expression实现Table居中显示
2013/06/28 Javascript
关于js遍历表格的实例
2013/07/10 Javascript
固定表格行列(expression)在IE下适用
2013/07/25 Javascript
jQuery实现的多屏图像图层切换效果实例
2015/05/07 Javascript
如何用javascript计算文本框还能输入多少个字符
2015/07/29 Javascript
JS制作适用于手机和电脑的通知信息效果
2016/10/28 Javascript
Vue.js常用指令汇总(v-if、v-for等)
2016/11/03 Javascript
laydate如何根据开始时间或者结束时间限制范围
2018/11/15 Javascript
JavaScript中的事件与异常捕获详析
2019/02/24 Javascript
JS实现4位随机验证码
2020/10/19 Javascript
JavaScript实现弹出窗口效果
2020/12/09 Javascript
[49:21]完美世界DOTA2联赛循环赛 Ink Ice vs LBZS BO2第二场 11.05
2020/11/06 DOTA
Python中的列表生成式与生成器学习教程
2016/03/13 Python
Python文件操作之合并文本文件内容示例代码
2017/09/19 Python
Flask实现图片的上传、下载及展示示例代码
2018/08/03 Python
Python格式化输出字符串方法小结【%与format】
2018/10/29 Python
python实现石头剪刀布程序
2021/01/20 Python
python hough变换检测直线的实现方法
2019/07/12 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
2019/07/22 Python
详解numpy.meshgrid()方法使用
2019/08/01 Python
完美解决pycharm导入自己写的py文件爆红问题
2020/02/12 Python
美国值得信赖的婚恋交友网站:eHarmony
2018/10/04 全球购物
家长会邀请书
2014/01/25 职场文书
初三班主任寄语大全
2014/04/04 职场文书
竞选班委演讲稿
2014/04/28 职场文书
2015年圣诞节活动总结
2015/03/24 职场文书
心术观后感
2015/06/11 职场文书
《乌鸦喝水》教学反思
2016/02/19 职场文书
解决golang post文件时Content-Type出现的问题
2021/05/02 Golang
发工资啦!教你用Python实现邮箱自动群发工资条
2021/05/10 Python
Python  序列化反序列化和异常处理的问题小结
2022/12/24 Python