基于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 相关文章推荐
redis连接被拒绝的解决方案
Apr 12 Redis
Redis如何一键部署脚本
Apr 12 Redis
浅谈Redis在直播场景的实践方案
Apr 27 Redis
深入理解redis中multi与pipeline
Jun 02 Redis
Windows中Redis安装配置流程并实现远程访问功能
Jun 07 Redis
你真的了解redis为什么要提供pipeline功能
Jun 22 Redis
redis cluster支持pipeline的实现思路
Jun 23 Redis
Redis中一个String类型引发的惨案
Jul 25 Redis
使用RedisTemplat实现简单的分布式锁
Nov 20 Redis
解决linux下redis数据库overcommit_memory问题
Feb 24 Redis
Redis基本数据类型Zset有序集合常用操作
Jun 01 Redis
Redis实战之Lettuce的使用技巧详解
Dec 24 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连接Oracle数据库
2006/10/09 PHP
PHP 错误之引号中使用变量
2009/05/04 PHP
PHP实现将HTML5中Canvas图像保存到服务器的方法
2014/11/28 PHP
Laravel5.1 框架Request请求操作常见用法实例分析
2020/01/04 PHP
学习面向对象之面向对象的基本概念:对象和其他基本要素
2010/11/30 Javascript
jquery的冒泡事件的阻止与允许(三种实现方法)
2013/02/01 Javascript
jQuery中:first-child选择器用法实例
2014/12/31 Javascript
JS数组合并push与concat区别分析
2015/12/17 Javascript
jQuery中通过ajax的get()函数读取页面的方法
2016/02/29 Javascript
jquery mobile 实现自定义confirm确认框效果的简单实例
2016/06/17 Javascript
jQuery实现智能判断固定导航条或侧边栏的方法
2016/09/04 Javascript
ionic开发中点击input时键盘自动弹出
2016/12/23 Javascript
浅谈JavaScript的innerWidth与innerHeight
2017/10/12 Javascript
实例讲解javascript实现异步图片上传方法
2017/12/05 Javascript
Vue 通过自定义指令回顾v-内置指令(小结)
2018/09/03 Javascript
Vue路由history模式解决404问题的几种方法
2018/09/29 Javascript
小程序页面动态配置实现方法
2019/02/05 Javascript
微信小程序前端自定义分享的实现方法
2019/06/13 Javascript
layui实现checkbox的目录树tree的例子
2019/09/12 Javascript
JavaScript实现切换多张图片
2021/01/27 Javascript
Python常用内置模块之xml模块(详解)
2017/05/23 Python
详解Python map函数及Python map()函数的用法
2017/11/16 Python
Django中数据库的数据关系:一对一,一对多,多对多
2018/10/21 Python
Python3中exp()函数用法分析
2019/02/19 Python
Flask框架踩坑之ajax跨域请求实现
2019/02/22 Python
python binascii 进制转换实例
2019/06/12 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
2019/12/11 Python
Python包,__init__.py功能与用法分析
2020/01/07 Python
Python基于class()实现面向对象原理详解
2020/03/26 Python
Python闭包装饰器使用方法汇总
2020/06/29 Python
Linux中如何用命令创建目录
2016/12/02 面试题
标准毕业生自荐信范文
2013/11/04 职场文书
销售副总经理岗位职责
2013/12/11 职场文书
公司部门司机岗位职责
2014/01/03 职场文书
家长对老师的评语
2014/04/18 职场文书
Python如何使用logging为Flask增加logid
2021/03/30 Python