基于Redis过期事件实现订单超时取消


Posted in Redis onMay 08, 2021

订单超时取消的实现,首先想到的是定时任务,但是这种实现方式在订单量较大的情况下是有问题的,而且时间也会有误差,最大时间差就是定时任务的执行间隔时间。

使用redis的过期监听事件可以比较好的解决这个问题。实现的方式是订单创建后向redus中存一记录,一般就以订单号为key。设置过期时间(订单超时时间),一旦时间超时会触发监听事件,这时候就可以通过key判断这个订单是否支付,未支付时取消订单。

redis过期监听的实现:

1.修改redis.windows.conf配置文件中notify-keyspace-events的值

默认配置notify-keyspace-events的值为" ",修改为 notify-keyspace-events Ex 这样便开启了过期事件

基于Redis过期事件实现订单超时取消

2. 创建配置类RedisListenerConfig(配置RedisMessageListenerContainer这个Bean)

@Configuration
public class RedisListenerConfig {
 
    @Autowired
    private RedisTemplate redisTemplate;
 
    /**
     * 处理乱码
     * @return
     */
    @Bean
    public RedisTemplate redisTemplateInit() {
        // key序列化
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //val实例化
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
 
        return redisTemplate;
    }
 
 
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
 
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        return container;
    }
 
}

3.继承KeyExpirationEventMessageListener创建redis过期事件的监听类

KeyExpirationEventMessageListener类是org.springframework.data.redis.listener包下的实现类,通过继承这个类重写onMessage方法可以实现对redis所有过期事件的监听。

@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
    public RedisKeyExpirationListener(RedisMessageListenerContainer container) {
        super(container);
    }
 
    /**
     * 针对redis数据失效事件,进行数据处理
     * @param message
     * @param pattern
     */
    @Override
    public void onMessage(Message message, byte[] pattern) {
       String key=message.toString();//生效的key
        if (key!=null && key.startsWith("order")){//从失效key中筛选代表订单失效的key
            //截取订单号,查询订单,如果是未支付状态则取消订单
            String orderNo=key.substring(5);
            System.out.println("订单号为:"+orderNo+"的订单超时未支付,取消订单");
 
        }
    }
}

测试

通过redis模拟创建一个有效时间为5s的订单:

基于Redis过期事件实现订单超时取消

5秒后程序成功监听到了过期事件:

基于Redis过期事件实现订单超时取消

到此这篇关于基于Redis过期事件实现订单超时取消的文章就介绍到这了,更多相关Redis 订单超时取消内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Redis 相关文章推荐
为Java项目添加Redis缓存的方法
May 18 Redis
Java Socket实现Redis客户端的详细说明
May 26 Redis
Windows中Redis安装配置流程并实现远程访问功能
Jun 07 Redis
聊一聊Redis与MySQL双写一致性如何保证
Jun 26 Redis
CentOS8.4安装Redis6.2.6的详细过程
Nov 20 Redis
浅谈Redis跟MySQL的双写问题解决方案
Feb 24 Redis
Redis调用Lua脚本及使用场景快速掌握
Mar 16 Redis
redis数据结构之压缩列表
Mar 21 Redis
Redis实战高并发之扣减库存项目
Apr 14 Redis
Redis实现一个账号只能登录一个设备
Apr 19 Redis
Redis高并发缓存架构性能优化
May 15 Redis
Redis基本数据类型Set常用操作命令
Jun 01 Redis
Redis实现订单自动过期功能的示例代码
May 08 #Redis
redis 限制内存使用大小的实现
使用Redis实现秒杀功能的简单方法
Redis6.0搭建集群Redis-cluster的方法
May 08 #Redis
浅谈Redis存储数据类型及存取值方法
Redis IP地址的绑定的实现
May 08 #Redis
redis通过6379端口无法连接服务器(redis-server.exe闪退)
You might like
PHP读MYSQL中文乱码的解决方法
2006/12/17 PHP
PHP的一个基础知识 表单提交
2011/07/04 PHP
is_uploaded_file函数引发的不能上传文件问题
2013/10/29 PHP
Laravel框架实现调用百度翻译API功能示例
2019/05/30 PHP
Gird事件机制初级读本
2007/03/10 Javascript
js arguments对象应用介绍
2012/11/28 Javascript
JS中获取数据库中的值的方法
2013/07/14 Javascript
判断js对象是否拥有某一个属性的js代码
2013/08/16 Javascript
JS在一定时间内跳转页面及各种刷新页面的实现方法
2016/05/26 Javascript
jQuery 自定义下拉框(DropDown)附源码下载
2016/07/22 Javascript
jQuery实现字体颜色渐变效果的方法
2017/03/29 jQuery
Vue 2.0入门基础知识之内部指令详解
2017/10/15 Javascript
angular2系列之路由转场动画的示例代码
2017/11/09 Javascript
vue.js中引入vuex储存接口数据及调用的详细流程
2017/12/14 Javascript
Nodejs模块载入运行原理
2018/02/23 NodeJs
详解webpack运行Babel教程
2018/06/13 Javascript
JavaScript惰性求值的一种实现方法示例
2019/01/11 Javascript
vue百度地图 + 定位的详解
2019/05/13 Javascript
浅谈ECMAScript 中的Array类型
2019/06/10 Javascript
jQuery实现获取多选框的值示例
2020/02/07 jQuery
JavaScript设计模式之策略模式实现原理详解
2020/05/29 Javascript
vue3.0生命周期的示例代码
2020/09/24 Javascript
[03:43]2014DOTA2西雅图国际邀请赛 newbee战队巡礼
2014/07/07 DOTA
Python列表删除的三种方法代码分享
2017/10/31 Python
python正则实现计算器功能
2017/12/14 Python
python删除过期log文件操作实例解析
2018/01/31 Python
Python操作word常见方法示例【win32com与docx模块】
2018/07/17 Python
python-itchat 统计微信群、好友数量,及原始消息数据的实例
2019/02/21 Python
Python实现多线程/多进程的TCP服务器
2019/09/03 Python
Python实时监控网站浏览记录实现过程详解
2020/07/14 Python
call在Python中改进数列的实例讲解
2020/12/09 Python
肯尼亚网上商城:Kilimall
2016/08/20 全球购物
苹果音乐订阅:Apple Music
2018/08/02 全球购物
大四学生找工作的自荐信
2014/03/27 职场文书
艺术学院毕业生求职信
2014/07/09 职场文书
Redis+Lua脚本实现计数器接口防刷功能(升级版)
2022/02/12 Redis