基于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
Windows下redis下载、redis安装及使用教程
Jun 02 Redis
Redis入门教程详解
Aug 30 Redis
Window server中安装Redis的超详细教程
Nov 17 Redis
Redis中缓存穿透/击穿/雪崩问题和解决方法
Dec 04 Redis
Redis如何使用乐观锁(CAS)保证数据一致性
Mar 25 Redis
使用Redis做预定库存缓存功能
Apr 02 Redis
redis 解决库存并发问题实现数量控制
Apr 08 Redis
Redis特殊数据类型Geospatial地理空间
Jun 01 Redis
关于Redis的主从复制及哨兵问题
Jun 16 Redis
如何使用注解方式实现 Redis 分布式锁
Jul 23 Redis
Redis配置外网可访问(redis远程连接不上)的方法
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加密解密函数分享
2014/06/05 PHP
跟我学Laravel之快速入门
2014/10/15 PHP
phpstorm配置Xdebug进行调试PHP教程
2014/12/01 PHP
使用JavaScript动态设置样式实现代码及演示动画
2013/01/25 Javascript
jquery实现textarea输入字符控制(仿微博输入控制字符)
2013/04/26 Javascript
jquery全选checkBox功能实现代码(取消全选功能)
2013/12/10 Javascript
Javascript 遍历页面text控件详解
2014/01/06 Javascript
JavaScript fontsize方法入门实例(按照指定的尺寸来显示字符串)
2014/10/17 Javascript
jQuery实现购物车数字加减效果
2015/03/14 Javascript
javascript设计模式之对象工厂函数与构造函数详解
2015/07/30 Javascript
JS+Canvas绘制时钟效果
2020/08/20 Javascript
类似于QQ的右滑删除效果的实现方法
2016/10/16 Javascript
Node.js中sequelize时区的配置方法
2017/12/10 Javascript
JS字典Dictionary类定义与用法示例
2019/02/01 Javascript
JavaScript Array对象基本方法详解
2019/09/03 Javascript
关于Layui Table隐藏列问题
2019/09/16 Javascript
jQuery 筛选器简单操作示例
2019/10/02 jQuery
[48:02]Ti4循环赛第三日 VG vs Liquid和NEWBEE vs DK
2014/07/12 DOTA
[04:49]2014DOTA2国际邀请赛 Newbee顺利挺进总决赛 ImbaTV独家专访
2014/07/19 DOTA
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
2018/03/22 Python
python实现守护进程、守护线程、守护非守护并行
2018/05/05 Python
python协程之动态添加任务的方法
2019/02/19 Python
python 将字符串完成特定的向右移动方法
2019/06/11 Python
Python使用tkinter模块实现推箱子游戏
2019/10/08 Python
pyftplib中文乱码问题解决方案
2020/01/11 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
全球领先的鞋类零售商:The Walking Company
2016/07/21 全球购物
阿迪达斯印度官方商城:adidas India
2017/03/26 全球购物
美国汽车零部件和配件网站:CarParts
2019/03/13 全球购物
酒店管理自荐信
2013/10/23 职场文书
怎么写有吸引力的自荐信
2013/11/17 职场文书
创意活动策划书
2014/01/15 职场文书
大学班级计划书
2014/04/29 职场文书
论文答辩开场白大全
2015/05/27 职场文书
《彼得与狼》教学反思
2016/02/20 职场文书
MySQL大小写敏感的注意事项
2021/05/24 MySQL