基于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 14 Redis
redis实现共同好友的思路详解
May 26 Redis
Redis基于Bitmap实现用户签到功能
Jun 20 Redis
Redis 彻底禁用RDB持久化操作
Jul 09 Redis
Redis集群新增、删除节点以及动态增加内存的方法
Sep 04 Redis
分布式Redis Cluster集群搭建与Redis基本用法
Feb 24 Redis
源码分析Redis中 set 和 sorted set 的使用方法
Mar 22 Redis
Redis 哨兵机制及配置实现
Mar 25 Redis
redis sentinel监控高可用集群实现的配置步骤
Apr 01 Redis
使用Redis实现分布式锁的方法
Jun 16 Redis
如何使用注解方式实现 Redis 分布式锁
Jul 23 Redis
Redis主从复制操作和配置详情
Sep 23 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中使用灵巧的体系结构
2006/10/09 PHP
Laravel框架表单验证详解
2014/09/04 PHP
php实现按照权重随机排序数据的方法
2015/01/09 PHP
php实现阿拉伯数字和罗马数字相互转换的方法
2015/04/17 PHP
WordPress中查询文章的循环Loop结构及用法分析
2015/12/17 PHP
jBox 2.3基于jquery的最新多功能对话框插件 常见使用问题解答
2011/11/10 Javascript
js 程序执行与顺序实现详解
2013/05/13 Javascript
浅谈javascript中基本包装类型
2015/06/03 Javascript
javascript的 {} 语句块详解
2016/02/27 Javascript
JavaScript利用闭包实现模块化
2017/01/13 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(上)
2018/04/18 Javascript
使用淘宝镜像cnpm安装Vue.js的图文教程
2018/05/17 Javascript
JS跨域请求的问题解析
2018/12/03 Javascript
angular中两种表单的区别(响应式和模板驱动表单)
2018/12/06 Javascript
JS实现扫码枪扫描二维码功能
2020/01/03 Javascript
[02:19]DOTA2女子战队FOX视频专访:希望更多美眉一起加入
2013/10/15 DOTA
Python统计列表中的重复项出现的次数的方法
2014/08/18 Python
python绘制简单彩虹图
2018/11/19 Python
Django 实现前端图片压缩功能的方法
2019/08/07 Python
浅谈django url请求与数据库连接池的共享问题
2019/08/29 Python
通过实例了解python property属性
2019/11/01 Python
python DataFrame转dict字典过程详解
2019/12/26 Python
Python fileinput模块如何逐行读取多个文件
2020/10/05 Python
python实现录音功能(可随时停止录音)
2020/10/26 Python
Python基于template实现字符串替换
2020/11/27 Python
CSS3教程(5):网页背景图片
2009/04/02 HTML / CSS
CSS3 rgb and rgba(透明色)的使用详解
2020/09/25 HTML / CSS
电子商务专业个人的自我评价
2013/11/19 职场文书
教师档案管理制度
2014/01/23 职场文书
校庆活动方案
2014/03/31 职场文书
优秀的导游求职信范文
2014/04/06 职场文书
公司股东合作协议书
2014/09/14 职场文书
2019西餐厅创业计划书范文!
2019/07/12 职场文书
编写python程序的90条建议
2021/04/14 Python
MySQL中的布尔值,怎么存储false或true
2021/06/04 MySQL
详解Vue中$props、$attrs和$listeners的使用方法
2022/02/18 Vue.js