基于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 相关文章推荐
在K8s上部署Redis集群的方法步骤
Apr 27 Redis
Redis IP地址的绑定的实现
May 08 Redis
深入浅析Redis 集群伸缩原理
May 15 Redis
厉害!这是Redis可视化工具最全的横向评测
Jul 15 Redis
redis 存储对象的方法对比分析
Aug 02 Redis
Redis RDB技术底层原理详解
Sep 04 Redis
Jedis操作Redis实现模拟验证码发送功能
Sep 25 Redis
Window server中安装Redis的超详细教程
Nov 17 Redis
解决redis批量删除key值的问题
Mar 23 Redis
Redis安装使用RedisJSON模块的方法
Mar 23 Redis
Redis分布式锁的7种实现
Apr 01 Redis
使用Redis做预定库存缓存功能
Apr 02 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
setcookie中Cannot modify header information-headers already sent by错误的解决方法详解
2013/05/08 PHP
php实现curl模拟ftp上传的方法
2015/07/29 PHP
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
通过实例解析PHP数据类型转换方法
2020/07/11 PHP
js 字符串转换成数字的三种方法
2013/03/23 Javascript
关于jQuery新的事件绑定机制on()的使用技巧
2013/04/26 Javascript
Textarea根据内容自适应高度
2013/10/28 Javascript
button没写type=button会导致点击时提交
2014/03/06 Javascript
node.js集成百度UE编辑器
2015/02/05 Javascript
jQuery简单tab切换效果实现方法
2015/04/08 Javascript
如何用javascript计算文本框还能输入多少个字符
2015/07/29 Javascript
javascript常见数字进制转换实例分析
2016/04/21 Javascript
AngularJS ng-change 指令的详解及简单实例
2016/07/30 Javascript
javascript 利用arguments实现可变长参数
2016/11/21 Javascript
js Canvas绘制圆形时钟教程
2017/02/06 Javascript
详解前后端分离之VueJS前端
2017/05/24 Javascript
Express+Nodejs 下的登录拦截实现代码
2017/07/01 NodeJs
vue-cli项目修改文件热重载失效的解决方法
2018/09/19 Javascript
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
2020/12/30 Vue.js
[49:05]OG vs Newbee 2019DOTA2国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
Python对小数进行除法运算的正确方法示例
2014/08/25 Python
浅谈python中截取字符函数strip,lstrip,rstrip
2015/07/17 Python
浅析python递归函数和河内塔问题
2017/04/18 Python
简单实现python进度条脚本
2017/12/18 Python
python如何读取bin文件并下发串口
2019/07/05 Python
python Tcp协议发送和接收信息的例子
2019/07/22 Python
详解基于python的图像Gabor变换及特征提取
2020/10/26 Python
PyChon中关于Jekins的详细安装(推荐)
2020/12/28 Python
6号汽车旅馆预订:Motel 6
2018/02/11 全球购物
介绍一下Ruby的特点
2013/01/20 面试题
工商管理专业实习大学生自我鉴定
2013/09/19 职场文书
如何写你的创业计划书
2014/01/07 职场文书
八年级音乐教学反思
2014/01/09 职场文书
团日活动总结
2014/04/28 职场文书
餐饮商业计划书范文
2014/04/29 职场文书
linux目录管理方法介绍
2022/06/01 Servers