redis实现订单过期取消
redis过期监听的实现:
1.修改redis.windows.conf配置文件中notify-keyspace-events的值
默认配置notify-keyspace-events的值为 ""
修改为 notify-keyspace-events Ex 这样便开启了过期事件
2. 创建配置类RedisListenerConfig(配置RedisMessageListenerContainer这个Bean)
package com.zjt.shop.config;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;/*** 作者:zhuLin* 日期:2020-08-21 11:48* 备注:redis监听配置*/@Configuration
public class RedisListenerConfig {@Autowiredprivate RedisTemplate redisTemplate;/*** 处理乱码* @return*/@Beanpublic RedisTemplate redisTemplateInit() {// key序列化redisTemplate.setKeySerializer(new StringRedisSerializer());//val实例化redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());return redisTemplate;}@BeanRedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory);return container;}}
3.继承KeyExpirationEventMessageListener创建redis过期事件的监听类
package com.zjt.shop.common.util;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.zjt.shop.modules.order.service.OrderInfoService;
import com.zjt.shop.modules.product.entity.OrderInfoEntity;
import com.zjt.shop.modules.product.mapper.OrderInfoMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;/*** 作者:zhuLin* 日期:2020-08-21 11:51* 备注:redis数据失效事件*/
@Slf4j
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {super(listenerContainer);}@Autowiredprivate OrderInfoMapper orderInfoMapper;/*** 针对redis数据失效事件,进行数据处理* @param message* @param pattern*/@Overridepublic void onMessage(Message message, byte[] pattern) {try {String key = message.toString();//从失效key中筛选代表订单失效的keyif (key != null && key.startsWith("order_")) {//截取订单号,查询订单,如果是未支付状态则为-取消订单String orderNo = key.substring(6);QueryWrapper<OrderInfoEntity> queryWrapper = new QueryWrapper<>();queryWrapper.eq("order_no",orderNo);OrderInfoEntity orderInfo = orderInfoMapper.selectOne(queryWrapper);if (orderInfo != null) {if (orderInfo.getOrderState() == 0) { //待支付orderInfo.setOrderState(4); //已取消orderInfoMapper.updateById(orderInfo);log.info("订单号为【" + orderNo + "】超时未支付-自动修改为已取消状态");}}}} catch (Exception e) {e.printStackTrace();log.error("【修改支付订单过期状态异常】:" + e.getMessage());}}
}
4:测试
通过redis客户端存一个有效时间为3s的订单:
结果:
redis实现订单过期取消相关推荐
- Springboot----项目整合微信支付(引入延迟队列实现订单过期取消以及商户主动查单)
前言 目前更新的是Springboot项目整合微信支付系列的文章,可以在我的主页中找到该系列其他文章,这一系列的文章将会系统介绍如何在项目中引入微信支付的下单.关单.处理回调通知等功能.由于前面创作经 ...
- java订单超时取消设计_PHP如何实现处理过期或者超时订单的,并还原库存
文章来自:php自学中心网站 链接:http://www.startphp.cn/front/php/122378.html 作者:磊丰 商务合作:请加微信(QQ):2230304070 视频教程 码 ...
- redistemplate hash 过期时间_Redis过期监听——订单超时-取消
最近在做电商项目,涉及支付超时处理的几种方式.[记录哈使用redis监听处理] 提交订单的时候,支付-超过了有效时间则支付状态自动更新为已取消. 欢迎交流 redis过期监听的实现: 1.修改redi ...
- 订单过期 自动取消实现方案
在电商.支付等领域,往往会有这样的场景,用户下单后放弃支付了,那这笔订单会在指定的时间段后进行关闭操作,细心的你一定发现了像某宝.某东都有这样的逻辑,而且时间很准确,误差在1s内:那他们是怎么实现的呢 ...
- 【项目实战】Redis使用场景之待支付订单自动取消、订单自动收货
一.使用背景 很多业务场景,例如订单过期自动删除,订单几天后自动好评,这些常用操作可以通过定时任务,数据库轮询做,但是订单量大的情况可能会对数据库产生大的压力. 二.Redis的key过期推送功能原理 ...
- php 订单过期处理,PHP实现处理过期或者超时订单,并还原库存
订单是我们在日常开发中经常会遇到的一个功能,最近在做一个订单过期与超时的开发.订单过期与超时就不用我解释了吧,其实两者都是同一个问题来着,就是订单未支付的处理,我们要做的是对这些未支付的订单到了一定时 ...
- redis 用户订单缓存_Redis实战(12)-基于Key失效和定时任务实现订单支付超时自动失效...
"商城平台用户下单"这一业务场景相信很多小伙伴并不陌生,在正常的情况下,用户在提交完订单/下完单之后,应该是前往"收银台"选择支付方式进行支付,之后只需要提供相 ...
- RabbitMQ实现订单超时设计思路、以及在订单过期临界点支付成功如何处理
场景: 我们知道用 RabbitMQ 的延时队列可以实现用户下单后在 xxx 时间内未支付,需要自动关闭订单.但如果用户在订单即将过期的最后一秒支付成功.那么这笔订单算不算正常下单?要不要释放库存? ...
- java控制订单过期时间_订单自动过期实现方案
需求分析:24小时内未支付的订单过期失效. 解决方案被动设置:在查询订单的时候检查是否过期并设置过期状态. 定时调度:定时器定时查询并过期需要过期的订单. 延时队列:将未支付的订单放入一个延时队列中, ...
- 下单后半小时未付款订单自动取消的实现,延迟队列
下单后半小时未付款订单自动取消的实现,延迟队列 类似的需要: 订单的评论如果7天未评价,系统需要自动产生一条评论 订单的15天之后未点击收货,系统需要自动更改为已收货. ... 因为是需要一个常驻进程 ...
最新文章
- Premiere制作VCD视频几个关键设置
- c#中BackGroundWorker控件
- 十九、MySQL常用命令总结
- ASP游戏工作室网站源码v1.0
- 蒙特卡洛方法_程序媛转TA之理论篇十三:蒙特卡洛方法
- 期待鸿蒙是什么意思,如何看待华为将于 6月2 日举办鸿蒙发布会?你对此有哪些期待?...
- 实体词典 情感词典_基于词典的情感分析——简单实例
- 2014牡丹江——Hierarchical Notation
- [转]@html.ActionLink的几种参数格式
- 生成QQ/MSN/旺旺/SKYPE等在线状态图标
- 2020总结及2021展望
- 注意 怎么选择车险附加险?避免“这也不赔那也不赔”
- 实测超轻量中文OCR开源项目,总模型仅17M
- 小酷智慧地图3D导览v1.0.84 打卡定位 地图打卡
- 过年“飞”回家?携带移动电源登机需注意!
- 2020年4月程序员工资统计,人工智能工资大跌
- Proxy error: Could not proxy request
- 考研计算机南大和武大难度,全国高校考研录取难度排行榜,浙大第五、南大第十!武大掉出前十...
- 2021年熔化焊接与热切割找解析及熔化焊接与热切割模拟考试
- java毕设项目汉服服装租赁系统(附源码)