基于Redis订单未支付30分钟自动取消

文章目录

          • 一、原理实现
            • 1. 超时消费流程图
            • 2. 订单超时30分钟实现原理
          • 二、核心代码实战
            • 2.1. 记录订单待支付数据
            • 2.2. redis配置
            • 2.3. 超时消费者监听

一、原理实现
1. 超时消费流程图

在这里插入图片描述

2. 订单超时30分钟实现原理

①用户下单之后,投递一个订单号码存放到redis服务端,该订单号码过期时间为30分钟
②redis客户端监听redis服务端指定数据库的将过期的订单号码key,对将过期的订单号码进行筛选。
③对筛选出来的订单号码进行核对校验

  • 1.订单中是否存在
  • 2>携带订单号码调用支付宝查询订单支付状态是否为待支付
  • 3>更新该订单号码状态
二、核心代码实战
2.1. 记录订单待支付数据
 /*** 订单会调用改接口提前将用户下单的金额、订单号码 传递到支付 提前存储到支付信息表中状态为待支付状态** @param payOrderTokenDto* @return*/@Overridepublic BaseResponse<String> toPayResultToken(PayOrderTokenDto payOrderTokenDto) {//1.验证参数代码略//2.将该数据插入到支付信息表中PaymentInfoEntity paymentChannelEntity = dtoToDo(payOrderTokenDto, PaymentInfoEntity.class);int result = paymentInfoMapper.insert(paymentChannelEntity);if (result <= 0) {return setResultError("插入支付记录失败!");}// 生成token令牌Long id = paymentChannelEntity.getId();//3.生成支付token令牌给vueString payToken = tokenUtils.createToken(id + "");// 向mq投递一条msg消息 设置过期时间 30分钟// TODO 将订单号码存储到redis中并设置过期时间为30分钟return setResultSuccess(payToken);}
2.2. redis配置

在这里插入图片描述

@Configuration
public class RedisConfig {@BeanRedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory);//redis之监听database0 库的将要过期keycontainer.addMessageListener(new RedisKeyExpirationListener(container), new PatternTopic("__keyevent@0__:expired"));return container;}
}
2.3. 超时消费者监听
@Component
@Slf4j
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {@Autowiredprivate PayOrderTimeoutService payOrderTimeoutService;public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {super(listenerContainer);}/*** 针对 redis 数据失效事件,进行数据处理** @param message* @param pattern*/@Overridepublic void onMessage(Message message, byte[] pattern) {// redis 客户端监听 Redis 16库 每个库对应不同的业务逻辑 前缀 order_timeOut_支付idString key = message.toString();if (key.contains("order_timeOut_")) {String keyDeal = key.replace("order_timeOut_", "");log.info(">keyDeal:{}已经过期!<", keyDeal);Long payId = Long.parseLong(keyDeal);payOrderTimeoutService.orderTimeout(payId);}}
}
@Service
public class PayOrderTimeoutService {@Autowiredprivate PaymentInfoMapper paymentInfoMapper;public boolean orderTimeout(Long payId) {// 消费者获取 支付的id  消费者如何消费 批量获取msg、多个消费者 、查询db   查询n个未支付状态id// 1.根据该支付id 查询支付订单信息 状态   异步回调中如果用户支付成功了,从rabbitmq 将该消息删除 清理过期keyPaymentInfoEntity paymentInfoEntity = paymentInfoMapper.selectById(payId);if (paymentInfoEntity == null) {return false;}// 2.如果支付状态是为未支付的话,则将该状态该已超时if (!PaymentConstant.PAYMENT_STATUS_NOT.equals(paymentInfoEntity.getPaymentStatus())) {return false;}// 3. 主动调用下  支付宝接口 根据 订单状态查询 支付宝这边是否已经支付了---31 32分钟 调用支付宝接口查询// 用户跳转到支付页面支付超时30分钟// 3.调用库存接口 增加库存(33)  修改该状态为超时paymentInfoEntity.setPaymentStatus(PaymentConstant.PAYMENT_STATUS_TIMEOUT);paymentInfoMapper.updateById(paymentInfoEntity);// 调用库存接口 新增库存return true;}
}

补充:不建议使用redis实现
请勿过度依赖Redis的过期监听
https://developer.aliyun.com/article/760276

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/515203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面向 K8s 设计误区

作者 | 姬望来源 | 阿里巴巴中间件头图 | 下载于视觉中国K8s 设计模式Kubernetes 是一个具有普遍意义的容器编排工具&#xff0c;它提供了一套基于容器构建分布式系统的基础依赖&#xff0c;其意义等同于 Linux 在操作系统中的地位&#xff0c;可以认为是分布式的操作系统。自定…

安装docker-compose插件

文章目录一、安装docker-compose插件1. 下载docker-compose插件2. 赋予权限3. 验证一、安装docker-compose插件 1. 下载docker-compose插件 curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/…

突围数字化转型,让特步同比增长24.8%的全渠道中台

简介&#xff1a; 多年前&#xff0c;曾有媒体向丁水波提问&#xff1a;“对于你个人来说&#xff0c;转型过程中最痛苦的部分是什么&#xff1f;”“最关键的是市场意识的转变。耳听为虚眼见为实&#xff0c;做起来给外界看到了&#xff0c;他们才会明白和接受。很多东西得做完…

赠书 | 什么是 Knative?

作者 | 李志伟、游杨来源 | 华章计算机头图 | 下载于视觉中国✎ 导读 什么是Knative&#xff1f;本文将对Knative的产生背景及发展历程&#xff0c;架构设计&#xff0c;受众群体等做详细介绍。Knative是由谷歌发起&#xff0c;有Pivotal、IBM、Red Hat等公司共同参与开发的Ser…

canal kafka 实现mysql与es/redis 数据同步

文章目录一、原理实现1. 方案设计流程图2. 实现原理二、mysql开启binlog模式2.1. 配置my.ini2.2. 重启mysql服务2.3. 验证binlog模式2.4. 创建canal账号2.5. 账号验证三、docker-compose环境搭建3.1. 环境总览3.2. 编写docker-compose.yml3.3. 安装docker-compose3.4. 构建环境…

免费下载!《阿里工程师的自我修养》公开10位阿里大牛解决问题的思维方式

简介&#xff1a; 今天&#xff0c;阿里技术公布一波阿里P8、P9技术大牛的思维模型&#xff0c;将他们的思维模式呈现出来。你可以在阿里资深专家职业生涯的真切感悟中&#xff0c;找到应对危机的最佳方法。《阿里工程师的自我修养》现已正式公开&#xff0c;可免费下载阅读。 …

云原生时代消息中间件的演进路线

简介&#xff1a; 本文整理自作者于 2020 年云原生微服务大会上的分享《云原生时代的消息中间件演进》&#xff0c;主要探讨了传统的消息中间件如何持续进化为云原生的消息服务。 作者 | 周礼&#xff08;不铭&#xff09; 阿里巴巴集团消息中间件架构师 导读&#xff1a;本文…

四大“化学融合”、两大核心平台能力,华为首次系统解读OneStorage

4月14日&#xff0c;在2021华为全球分析师大会期间&#xff0c;华为举办数据存储专场Session&#xff0c;面向全球分析师全面解读下一代数据存储解决方案OneStorage&#xff0c;引领数据存储产业迈向全场景智能和多云融合。同时&#xff0c;在此期间华为首次向业界系统性地诠释…

科普|不同协议下远程服务器文件上传_下载优劣对比

简介&#xff1a; 作为一个程序员&#xff0c;如果不知道如何进行远程服务器的文件上传与下载&#xff0c;实在是一件尴尬的事情&#xff0c;今天我们聊聊如何实现远程服务器的文件上传与下载。 作为一个程序员&#xff0c;如果不知道如何进行远程服务器的文件上传与下载&#…

Module build failed: Error: Cannot find module ‘gifsicle‘

问题描述&#xff1a; build Cannot find module ‘gifsicle’ 解决方案&#xff1a; 第一步&#xff1a;卸载image-webpack-loader 第1种方式&#xff1a;删除项目中的image-webpack-loader npm uninstall image-webpack-loader第2种方式&#xff1a;删除node_modules中的im…

高德AR驾车导航解决方案

简介&#xff1a; 高德从2018年首创了车载AR导航后&#xff0c;已经先后在后视镜、智能车盒、前装整车厂、后装车机产品、行车记录仪等众多场景落地应用&#xff0c;搭建了非常完整的AR导航生态。 日前&#xff0c;高德地图最新发布了v10.60新版本&#xff0c;上线了手机端的A…

第 11 个“世界备份日”刚过,《Veeam 2021 数据保护报告》为你解读全球数据备份现状

2011 年 3 月 31 日&#xff0c;美国网络社区 Reddit 发起“世界备份日&#xff08;World Backup Day&#xff09;”倡议活动&#xff0c;号召人们做好数据安全备份。于是每年愚人节前一天成为“世界备份日”&#xff0c;口号很有趣 Don’t Be An April Fool,Backup Your Data&…

知乎李大海对话阿里云贾扬清:透视AI应用难题与未来趋势

自AlphaGo接连战胜李世石与柯洁后&#xff0c;越来越多从业者将AI看做科技行业的未来。大大小小的AI公司兴起&#xff0c;国内外巨头公司纷纷加速向AI转型。但经历祛魅后的AI&#xff0c;在过去几年间却并未获得观察者们预想的火箭式爆发。 “AI行业接下来可能有哪些发展&…

当 Kubernetes 遇到机密计算,阿里巴巴如何保护容器内数据的安全?

简介&#xff1a; 8 月 26 日&#xff0c;我们发起了第 6 期 SIG Cloud-Provider-Alibaba 网研会直播。本次直播主要介绍了机密计算的概况&#xff0c; InclavareContainers 开源项目架构、已支持的功能和迭代计划&#xff0c;以及阿里云 ACK-TEE 的发展现状和规划。本文汇集了…

人脸核身基础版 SDK 接入 > 合作方后台上送身份信息

文章目录一、概述二、实现流程2.1. 获取获取 access_token2.2. 获取 SIGN ticket2.3. 生成签名2.4. 上送身份信息2.5. 获取 NONCE ticket三、实战3.1. 获取获取 access_token3.2. 获取 SIGN ticket3.3. 生成签名3.4. 上送身份信息3.5. 获取 NONCE ticket四、开源地址一、概述 …

5G、射频、奥特曼,这仨有联系吗?

作者 | 小枣君来源 | 鲜枣课堂头图 | 下载于ICphoto手机&#xff0c;作为移动互联网时代的标配&#xff0c;已经走进了我们每个人的生活。有了它&#xff0c;我们可以随心所欲地聊天、购物、追剧&#xff0c;享受美好的人生。正因为手机如此重要&#xff0c;所以人们对相关技术…

一种简单快捷的 java 热部署方式

简介&#xff1a; 本文热部署插件(Arthas Hot Swap)是基于 Arthas redefine 命令实现的&#xff0c;使用该插件进行远程热部署无需任何配置&#xff0c;无需使用 debug 端口&#xff0c;只需几个简单动作就能完成。 作者 | 周忠太 阿里巴巴淘系技术部的一个搬砖工 【Arthas 官…

赠书 | IoT 的真正目标是什么

以往在构建物联网局域网系统时&#xff0c;为了方便考虑&#xff0c;在云端进行数据处理和分析已经成了常识。但是这种做法已经无法应对现在的情况。在物联网中边缘计算的必要性想要获取数据就要增加连接的设备数量&#xff0c;提高从传感器采集数据的记录&#xff08;获取&…

AI 腾讯云人脸核身之独立H5接入

文章目录一、概述二、合作方后台上送身份信息~实现流程2.1. 前端入参2.2. 后端固定参数2.3. 获取 Access Token2.4. 获取 SIGN ticket2.5. 生成签名2.6. 合作方后台上送身份信息三、启动H5人脸核身3.1. 获取h5faceId3.2. 获取nonce3.3. 获取nonceTicket3.4. 计算启动签名3.5. 构…

最佳实践:使用阿里云CDN加速OSS访问

简介&#xff1a; 用户直接访问OSS资源&#xff0c;访问速度会受到OSS的下行带宽以及Bucket地域的限制。如果通过CDN来访问OSS资源&#xff0c;带宽上限更高&#xff0c;并且可以将OSS的资源缓存至就近的CDN节点&#xff0c;通过CDN节点进行分发&#xff0c;访问速度更快&#…