基于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数据结构之链表与字典的使用
May 11 Redis
redis实现排行榜功能
May 24 Redis
了解Redis常见应用场景
Jun 23 Redis
浅析Redis Sentinel 与 Redis Cluster
Jun 24 Redis
Redis模仿手机验证码发送的实现示例
Nov 02 Redis
面试分析分布式架构Redis热点key大Value解决方案
Mar 13 Redis
在Centos 8.0中安装Redis服务器的教程详解
Mar 21 Redis
Redis安装使用RedisJSON模块的方法
Mar 23 Redis
 Redis 串行生成顺序编码的方法实现
Apr 03 Redis
Redis实现订单过期删除的方法步骤
Jun 05 Redis
基于redis+lua进行限流的方法
Jul 23 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
Adodb的十个实例(清晰版)
2006/12/31 PHP
PHP中session跨子域的三种实现方法
2016/07/25 PHP
PHP查询大量数据内存耗尽问题的解决方法
2016/10/28 PHP
PHP实现创建一个RPC服务操作示例
2020/02/23 PHP
Jquery在指定DIV加载HTML示例代码
2014/02/17 Javascript
js对象转json数组的简单实现案例
2014/02/28 Javascript
jquery操作复选框checkbox的方法汇总
2015/02/05 Javascript
javascript每日必学之封装
2016/02/23 Javascript
jQuery+ajax简单实现文件上传的方法
2016/06/03 Javascript
bootstrap模态框垂直居中效果
2016/12/03 Javascript
原生js实现返回顶部缓冲效果
2017/01/18 Javascript
js仿淘宝评价评分功能
2017/02/28 Javascript
JS实现的简单标签点击切换功能示例
2017/09/21 Javascript
React Native预设占位placeholder的使用
2017/09/28 Javascript
使用 Node.js 开发资讯爬虫流程
2018/01/07 Javascript
jquery的 filter()方法使用教程
2018/03/22 jQuery
vue组件实现弹出框点击显示隐藏效果
2020/10/26 Javascript
vue项目中使用百度地图的方法
2018/06/08 Javascript
详解webpack运行Babel教程
2018/06/13 Javascript
Vue自定义toast组件的实例代码
2018/08/15 Javascript
详解如何在Vue里建立长按指令
2018/08/20 Javascript
javascript中toFixed()四舍五入使用方法详解
2018/09/28 Javascript
Python中使用platform模块获取系统信息的用法教程
2016/07/08 Python
python利用dir函数查看类中所有成员函数示例代码
2017/09/08 Python
利用 python 对目录下的文件进行过滤删除
2017/12/27 Python
PyQt5每天必学之像素图控件QPixmap
2018/04/19 Python
Python判断两个文件是否相同与两个文本进行相同项筛选的方法
2019/03/01 Python
台湾屈臣氏网路商店:Watsons台湾
2020/12/29 全球购物
建筑结构施工专业推荐信
2014/02/21 职场文书
工作保证书范文
2014/04/29 职场文书
2014年保育员工作总结
2014/12/02 职场文书
2015年禁毒宣传活动总结
2015/03/25 职场文书
于丹论语心得观后感
2015/06/15 职场文书
初中团支书竞选稿
2015/11/21 职场文书
七年级作文之我的梦想
2019/10/16 职场文书
Sql-Server数据库单表查询 4.3实验课
2021/04/05 SQL Server