基于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存储数据类型及存取值方法
May 08 Redis
基于Redis过期事件实现订单超时取消
May 08 Redis
Windows下redis下载、redis安装及使用教程
Jun 02 Redis
Redis字典实现、Hash键冲突及渐进式rehash详解
Sep 04 Redis
使用redis生成唯一编号及原理示例详解
Sep 15 Redis
高并发下Redis如何保持数据一致性(避免读后写)
Mar 18 Redis
解决redis批量删除key值的问题
Mar 23 Redis
redis复制有可能碰到的问题汇总
Apr 03 Redis
Redis数据同步之redis shake的实现方法
Apr 21 Redis
Redis特殊数据类型bitmap位图
Jun 01 Redis
基于Redission的分布式锁实战
Aug 14 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
桌面中心(三)修改数据库
2006/10/09 PHP
yii2.0框架使用 beforeAction 防非法登陆的方法分析
2019/09/11 PHP
js刷新框架子页面的七种方法代码
2008/11/20 Javascript
Jquery实现简单的动画效果代码
2012/03/18 Javascript
JQuery对id中含有特殊字符的转义处理示例
2013/09/06 Javascript
js实现网页倒计时、网站已运行时间功能的代码3例
2014/04/14 Javascript
node.js中的console.assert方法使用说明
2014/12/10 Javascript
JavaScript中的getTime()方法使用详解
2015/06/10 Javascript
微信小程序商城项目之商品属性分类(4)
2017/04/17 Javascript
浅析 NodeJs 的几种文件路径
2017/06/07 NodeJs
详解nodejs实现本地上传图片并预览功能(express4.0+)
2017/06/28 NodeJs
jQuery扩展_动力节点Java学院整理
2017/07/05 jQuery
详解vue 模版组件的三种用法
2017/07/21 Javascript
AngularJs返回前一页面时刷新一次前面页面的方法
2018/10/09 Javascript
Javascript的this详解
2019/03/23 Javascript
layui table动态表头 改变表格头部 重新加载表格的方法
2019/09/21 Javascript
详解微信小程序中var、let、const用法与区别
2020/01/11 Javascript
微信小程序indexOf的替换方法(推荐)
2020/01/14 Javascript
原生JS实现多条件筛选
2020/08/19 Javascript
详解Node.JS模块 process
2020/08/31 Javascript
使用Mock.js生成前端测试数据
2020/12/13 Javascript
python操作MongoDB基础知识
2013/11/01 Python
Python实现多条件筛选目标数据功能【测试可用】
2018/06/13 Python
Python切片操作深入详解
2018/07/27 Python
Python 音频生成器的实现示例
2019/12/24 Python
美国内衣第一品牌:Hanes(恒适)
2016/07/29 全球购物
乌克兰品牌化妆品和香水在线商店:Bomond
2020/01/14 全球购物
村级四风对照检查材料
2014/08/24 职场文书
党在我心中演讲稿
2014/09/02 职场文书
2014年仓库管理员工作总结
2014/11/18 职场文书
2014年采购部工作总结
2014/11/20 职场文书
2014年法院工作总结
2014/11/24 职场文书
爱国主义影片观后感
2015/06/18 职场文书
2019大学生暑期实习心得总结
2019/08/21 职场文书
mysql联合索引的使用规则
2021/06/23 MySQL
Python数据可视化之Seaborn的安装及使用
2022/04/19 Python