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
redis 限制内存使用大小的实现
May 08 Redis
基于Redis延迟队列的实现代码
May 13 Redis
Redis可视化客户端小结
Jun 10 Redis
你真的了解redis为什么要提供pipeline功能
Jun 22 Redis
在redisCluster中模糊获取key方式
Jul 09 Redis
Redis性能监控的实现
Jul 09 Redis
缓存替换策略及应用(以Redis、InnoDB为例)
Jul 25 Redis
Redis中缓存穿透/击穿/雪崩问题和解决方法
Dec 04 Redis
Redis基本数据类型哈希Hash常用操作命令
Jun 01 Redis
Redis实现短信验证码登录的示例代码
Jun 14 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生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
PHP下打开phpMyAdmin出现403错误的问题解决方法
2013/05/23 PHP
PHP实现的文件操作类及文件下载功能示例
2016/12/24 PHP
PHP正则表达式笔记与实例详解
2019/05/09 PHP
在你的网页中嵌入外部网页的方法
2007/04/02 Javascript
深入解析contentWindow, contentDocument
2013/07/04 Javascript
JQuery表格内容过滤的实现方法
2013/07/05 Javascript
js实现同一个页面多个渐变效果的方法
2015/04/10 Javascript
javascript实现dom动态创建省市纵向列表菜单的方法
2015/05/14 Javascript
基于JavaScript实现简单的随机抽奖小程序
2016/01/05 Javascript
Bootstrap源码解读表单(2)
2016/12/22 Javascript
js生成随机颜色方法代码分享(三种)
2016/12/29 Javascript
BootStrap 导航条实例代码
2017/05/18 Javascript
Node.js中Bootstrap-table的两种分页的实现方法
2017/09/18 Javascript
帝国cms首页列表页实现点赞功能
2017/10/30 Javascript
小程序实现多列选择器
2019/02/15 Javascript
详解Vue依赖收集引发的问题
2019/04/22 Javascript
解决在Vue中使用axios用form表单出现的问题
2019/10/30 Javascript
vue路由拦截器和请求拦截器知识点总结
2019/11/08 Javascript
VUE实现Studio管理后台之鼠标拖放改变窗口大小
2020/03/04 Javascript
在vue中实现禁止回退上一步,路由不存历史记录
2020/07/22 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
2020/11/09 Javascript
如何在JavaScript中等分数组的实现
2020/12/13 Javascript
[05:07]DOTA2英雄梦之声_第14期_暗影恶魔
2014/06/20 DOTA
详解Django框架中用context来解析模板的方法
2015/07/20 Python
在DigitalOcean的服务器上部署flaskblog应用
2015/12/19 Python
用python找出那些被“标记”的照片
2017/04/20 Python
Python3之简单搭建自带服务器的实例讲解
2018/06/04 Python
Python 读取有公式cell的结果内容实例方法
2020/02/17 Python
python3通过qq邮箱发送邮件以及附件
2020/05/20 Python
css3中新增的样式使用示例附效果图
2014/08/19 HTML / CSS
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
化学教育专业自荐信
2014/07/04 职场文书
2014年仓管员工作总结
2014/11/18 职场文书
2014高三学生考试作弊检讨书
2014/12/14 职场文书
铁头也玩根德 YachtBoy YB-230......
2022/04/05 无线电