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
Redis6.0搭建集群Redis-cluster的方法
May 08 Redis
详解redis分布式锁的这些坑
May 19 Redis
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
May 21 Redis
详解缓存穿透击穿雪崩解决方案
May 28 Redis
Redis 哨兵集群的实现
Jun 18 Redis
关于SpringBoot 使用 Redis 分布式锁解决并发问题
Nov 17 Redis
解决redis批量删除key值的问题
Mar 23 Redis
Redis中key的过期删除策略和内存淘汰机制
Apr 12 Redis
Redis特殊数据类型bitmap位图
Jun 01 Redis
Redis基本数据类型Set常用操作命令
Jun 01 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
海贼王动画变成“真人”后,凯多神还原,雷利太帅了!
2020/04/09 日漫
PHP实现克鲁斯卡尔算法实例解析
2014/08/22 PHP
Laravel 4 初级教程之安装及入门
2014/10/30 PHP
php实现URL加密解密的方法
2016/11/17 PHP
jQuery :nth-child前有无空格的区别分析
2011/07/11 Javascript
分享十五款 jQuery 社交网络分享插件
2015/05/16 Javascript
javascript手风琴下拉菜单实现代码
2015/11/12 Javascript
由浅入深讲解Javascript继承机制与simple-inheritance源码分析
2015/12/13 Javascript
学习使用jquery iScroll.js移动端滚动条插件
2020/03/24 Javascript
JQuery.validate在ie8下不支持的快速解决方法
2016/05/18 Javascript
dul无法加载bootstrap实现unload table/user恢复
2016/09/29 Javascript
详解JavaScript模块化开发
2016/12/04 Javascript
AngularJS服务service用法总结
2016/12/13 Javascript
在一个页面重复使用一个js函数的方法详解
2016/12/26 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
jQuery实现分页功能(含ajax请求、后台数据、附完整demo)
2017/04/03 jQuery
深入掌握 react的 setState的工作机制
2017/09/27 Javascript
详解vue-admin和后端(flask)分离结合的例子
2018/02/12 Javascript
浅谈在react中如何实现扫码枪输入
2018/07/04 Javascript
详解vantUI框架在vue项目中的应用踩坑
2018/12/06 Javascript
微信自定义分享链接信息(标题,图片和内容)实现过程详解
2019/09/04 Javascript
使用node-media-server搭建一个简易的流媒体服务器
2021/01/20 Javascript
实例讲解Python中的私有属性
2014/08/21 Python
python私有属性和方法实例分析
2015/01/15 Python
对Python3中的print函数以及与python2的对比分析
2018/05/02 Python
Python实现微信好友的数据分析
2019/12/16 Python
python图片指定区域替换img.paste函数的使用
2020/04/09 Python
h5封装下拉刷新
2020/08/25 HTML / CSS
TripAdvisor斯洛伐克:阅读评论、比较价格和酒店预订
2018/04/25 全球购物
美国球鞋寄卖网站:Stadium Goods
2018/05/09 全球购物
工程班组长岗位职责
2013/12/30 职场文书
学生拾金不昧表扬信
2014/01/21 职场文书
运动会通讯稿200字
2014/02/16 职场文书
财务工作检讨书
2014/10/29 职场文书
CSS3 制作的书本翻页特效
2021/04/13 HTML / CSS
nginx共享内存的机制详解
2022/03/21 Servers