基于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 查看所有的key方式
May 07 Redis
基于Redis延迟队列的实现代码
May 13 Redis
redis哨兵常用命令和监控示例详解
May 27 Redis
浅谈Redis位图(Bitmap)及Redis二进制中的问题
Jul 15 Redis
浅谈redis整数集为什么不能降级
Jul 25 Redis
springboot使用Redis作缓存使用入门教程
Jul 25 Redis
解决Redis启动警告问题
Feb 24 Redis
Redis如何使用乐观锁(CAS)保证数据一致性
Mar 25 Redis
基于Redis6.2.6版本部署Redis Cluster集群的问题
Apr 01 Redis
解决 redis 无法远程连接
May 15 Redis
Redis特殊数据类型HyperLogLog基数统计算法讲解
Jun 01 Redis
Redis全局ID生成器的实现
Jun 05 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的ASP防火墙
2006/10/09 PHP
PHP下利用shell后台运行PHP脚本,并获取该脚本的Process ID的代码
2011/09/19 PHP
非常好用的Zend Framework分页类
2014/06/25 PHP
php自定义urlencode,urldecode函数实例
2015/03/24 PHP
PHP使用phpunit进行单元测试示例
2019/09/23 PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
2020/03/16 PHP
javascript 实现 秒杀,团购 倒计时展示的记录 分享
2013/07/12 Javascript
addEventListener()第三个参数useCapture (Boolean)详细解析
2013/11/07 Javascript
js漂浮广告实现代码
2015/08/15 Javascript
jquery实现简单的banner轮播效果【实例】
2016/03/30 Javascript
纯JS单页面赛车游戏制作代码分享
2017/03/03 Javascript
javascript中mouseenter与mouseover的异同
2017/06/06 Javascript
vue中使用refs定位dom出现undefined的解决方法
2017/12/21 Javascript
Bootstrap实现的表格合并单元格示例
2018/02/06 Javascript
微信小程序单选框自定义赋值
2020/05/26 Javascript
python元组操作实例解析
2014/09/23 Python
Python multiprocessing模块中的Pipe管道使用实例
2015/04/11 Python
在Python的Django框架中实现Hacker News的一些功能
2015/04/17 Python
Python按行读取文件的简单实现方法
2016/06/22 Python
使用python3+xlrd解析Excel的实例
2018/05/04 Python
解决python "No module named pip" 的问题
2018/10/13 Python
pandas 如何分割字符的实现方法
2019/07/29 Python
详解字符串在Python内部是如何省内存的
2020/02/03 Python
如何写python的配置文件
2020/06/07 Python
Python多分支if语句的使用
2020/09/03 Python
一款纯css3实现的鼠标悬停动画按钮
2014/12/29 HTML / CSS
I.T集团香港官方商城:ITeSHOP.com Hong Kong
2019/02/15 全球购物
运动会广播稿150字
2014/02/19 职场文书
奉献演讲稿范文
2014/05/21 职场文书
力学专业求职信
2014/07/23 职场文书
海洋科学专业求职信
2014/08/10 职场文书
2014年辅导员工作总结
2014/11/18 职场文书
利用Python判断你的密码难度等级
2021/06/02 Python
Java方法重载和方法重写的区别到底在哪?
2021/06/11 Java/Android
详解Vue slot插槽
2021/11/20 Vue.js
css filter和getUserMedia的联合使用
2022/02/24 HTML / CSS