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实现订单过期取消相关推荐

  1. Springboot----项目整合微信支付(引入延迟队列实现订单过期取消以及商户主动查单)

    前言 目前更新的是Springboot项目整合微信支付系列的文章,可以在我的主页中找到该系列其他文章,这一系列的文章将会系统介绍如何在项目中引入微信支付的下单.关单.处理回调通知等功能.由于前面创作经 ...

  2. java订单超时取消设计_PHP如何实现处理过期或者超时订单的,并还原库存

    文章来自:php自学中心网站 链接:http://www.startphp.cn/front/php/122378.html 作者:磊丰 商务合作:请加微信(QQ):2230304070 视频教程 码 ...

  3. redistemplate hash 过期时间_Redis过期监听——订单超时-取消

    最近在做电商项目,涉及支付超时处理的几种方式.[记录哈使用redis监听处理] 提交订单的时候,支付-超过了有效时间则支付状态自动更新为已取消. 欢迎交流 redis过期监听的实现: 1.修改redi ...

  4. 订单过期 自动取消实现方案

    在电商.支付等领域,往往会有这样的场景,用户下单后放弃支付了,那这笔订单会在指定的时间段后进行关闭操作,细心的你一定发现了像某宝.某东都有这样的逻辑,而且时间很准确,误差在1s内:那他们是怎么实现的呢 ...

  5. 【项目实战】Redis使用场景之待支付订单自动取消、订单自动收货

    一.使用背景 很多业务场景,例如订单过期自动删除,订单几天后自动好评,这些常用操作可以通过定时任务,数据库轮询做,但是订单量大的情况可能会对数据库产生大的压力. 二.Redis的key过期推送功能原理 ...

  6. php 订单过期处理,PHP实现处理过期或者超时订单,并还原库存

    订单是我们在日常开发中经常会遇到的一个功能,最近在做一个订单过期与超时的开发.订单过期与超时就不用我解释了吧,其实两者都是同一个问题来着,就是订单未支付的处理,我们要做的是对这些未支付的订单到了一定时 ...

  7. redis 用户订单缓存_Redis实战(12)-基于Key失效和定时任务实现订单支付超时自动失效...

    "商城平台用户下单"这一业务场景相信很多小伙伴并不陌生,在正常的情况下,用户在提交完订单/下完单之后,应该是前往"收银台"选择支付方式进行支付,之后只需要提供相 ...

  8. RabbitMQ实现订单超时设计思路、以及在订单过期临界点支付成功如何处理

    场景: 我们知道用 RabbitMQ 的延时队列可以实现用户下单后在 xxx 时间内未支付,需要自动关闭订单.但如果用户在订单即将过期的最后一秒支付成功.那么这笔订单算不算正常下单?要不要释放库存? ...

  9. java控制订单过期时间_订单自动过期实现方案

    需求分析:24小时内未支付的订单过期失效. 解决方案被动设置:在查询订单的时候检查是否过期并设置过期状态. 定时调度:定时器定时查询并过期需要过期的订单. 延时队列:将未支付的订单放入一个延时队列中, ...

  10. 下单后半小时未付款订单自动取消的实现,延迟队列

    下单后半小时未付款订单自动取消的实现,延迟队列 类似的需要: 订单的评论如果7天未评价,系统需要自动产生一条评论 订单的15天之后未点击收货,系统需要自动更改为已收货. ... 因为是需要一个常驻进程 ...

最新文章

  1. Premiere制作VCD视频几个关键设置
  2. c#中BackGroundWorker控件
  3. 十九、MySQL常用命令总结
  4. ASP游戏工作室网站源码v1.0
  5. 蒙特卡洛方法_程序媛转TA之理论篇十三:蒙特卡洛方法
  6. 期待鸿蒙是什么意思,如何看待华为将于 6月2 日举办鸿蒙发布会?你对此有哪些期待?...
  7. 实体词典 情感词典_基于词典的情感分析——简单实例
  8. 2014牡丹江——Hierarchical Notation
  9. [转]@html.ActionLink的几种参数格式
  10. 生成QQ/MSN/旺旺/SKYPE等在线状态图标
  11. 2020总结及2021展望
  12. 注意 怎么选择车险附加险?避免“这也不赔那也不赔”
  13. 实测超轻量中文OCR开源项目,总模型仅17M
  14. 小酷智慧地图3D导览v1.0.84 打卡定位 地图打卡
  15. 过年“飞”回家?携带移动电源登机需注意!
  16. 2020年4月程序员工资统计,人工智能工资大跌
  17. Proxy error: Could not proxy request
  18. 考研计算机南大和武大难度,全国高校考研录取难度排行榜,浙大第五、南大第十!武大掉出前十...
  19. 2021年熔化焊接与热切割找解析及熔化焊接与热切割模拟考试
  20. java毕设项目汉服服装租赁系统(附源码)

热门文章

  1. 【ant项目构建学习点滴】--(3)打包及运行jar文件
  2. 201803101101_《函数的原始写法》
  3. 如何将驱动程序静态编译进内核
  4. Fizz Buzz 面试题
  5. ionic3 百度地图插件定位 问题
  6. [uva11174]村民排队 递推+组合数+线性求逆元
  7. 多个DbContext修改同一张表测试
  8. Python数据类型(数字)
  9. 关于 Java 数组的 12 个最佳方法
  10. Windows 2008 防火墙开放端口