基于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 27 Redis
Redis5之后版本的高可用集群搭建的实现
Apr 27 Redis
基于Redis实现分布式锁的方法(lua脚本版)
May 12 Redis
Redis 配置文件重要属性的具体使用
May 20 Redis
详解Redis复制原理
Jun 04 Redis
springboot使用Redis作缓存使用入门教程
Jul 25 Redis
关于redisson缓存序列化几枚大坑说明
Aug 04 Redis
在项目中使用redis做缓存的一些思路
Sep 14 Redis
redis数据结构之压缩列表
Mar 21 Redis
windows安装 redis 6.2.6最新步骤详解
Apr 26 Redis
Redis实现订单过期删除的方法步骤
Jun 05 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
Windows下的PHP5.0安装配制详解
2006/09/05 PHP
图书管理程序(三)
2006/10/09 PHP
PHP在获取指定目录下的目录,在获取的目录下面再创建文件,多平台
2011/08/03 PHP
php实现等比例不失真缩放上传图片的方法
2016/11/14 PHP
PHP的mysqli_stmt_init()函数讲解
2019/01/24 PHP
浅谈PHPANALYSIS提取关键字
2019/03/08 PHP
学习ExtJS TextField常用方法
2009/10/07 Javascript
使用js的replace()方法查找字符示例代码
2013/10/28 Javascript
Jquery ajax执行顺序 返回自定义错误信息(实例讲解)
2013/11/06 Javascript
利用AJAX实现WordPress中的文章列表及评论的分页功能
2016/05/17 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
2017/02/27 Javascript
JS身份证信息验证正则表达式
2017/06/12 Javascript
JS对象与JSON互转换、New Function()、 forEach()、DOM事件流等js开发基础小结
2017/08/10 Javascript
javascript代码优化的8点总结
2018/01/29 Javascript
Vue组件之自定义事件的功能图解
2018/02/01 Javascript
Node批量爬取头条视频并保存方法
2018/09/20 Javascript
JS模拟浏览器实现全局搜索功能
2019/09/11 Javascript
[50:58]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 Mineski vs EG
2018/04/03 DOTA
python安装与使用redis的方法
2016/04/19 Python
详解python OpenCV学习笔记之直方图均衡化
2018/02/08 Python
pyqt5使用按钮进行界面的跳转方法
2019/06/19 Python
python list转置和前后反转的例子
2019/08/26 Python
Python 脚本的三种执行方式小结
2019/12/21 Python
序列化Python对象的方法
2020/08/01 Python
Python: glob匹配文件的操作
2020/12/11 Python
深入浅析HTML5中的SVG
2015/11/27 HTML / CSS
XD健身器材:Kevlar球、Crossfit健身球
2019/03/26 全球购物
房地产员工找工作的自我评价
2013/11/15 职场文书
商业活动邀请函
2014/02/04 职场文书
节约用水的口号
2014/06/20 职场文书
体育专业求职信
2014/07/16 职场文书
工伤死亡理赔协议书
2014/10/20 职场文书
给客户的感谢信
2015/01/21 职场文书
部队2015年终工作总结
2015/04/02 职场文书
2015年团支书工作总结
2015/04/03 职场文书
详解MySQL连接挂死的原因
2021/05/18 MySQL