基于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 13 Redis
深入理解redis中multi与pipeline
Jun 02 Redis
Redis基于Bitmap实现用户签到功能
Jun 20 Redis
k8s部署redis cluster集群的实现
Jun 24 Redis
聊一聊Redis与MySQL双写一致性如何保证
Jun 26 Redis
Redis高并发防止秒杀超卖实战源码解决方案
Nov 01 Redis
redis sentinel监控高可用集群实现的配置步骤
Apr 01 Redis
sentinel支持的redis高可用集群配置详解
Apr 01 Redis
Redis实战高并发之扣减库存项目
Apr 14 Redis
Redis实现短信验证码登录的示例代码
Jun 14 Redis
使用Redis实现分布式锁的方法
Jun 16 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 EOT定界符的使用详解
2008/09/30 PHP
基于PHP静态类的原罪详解
2013/05/06 PHP
php第一次无法获取cookie问题处理
2014/12/15 PHP
php图像处理类实例
2015/07/28 PHP
docker-compose部署php项目实例详解
2019/07/30 PHP
jquery 常用操作整理 基础入门篇
2009/10/14 Javascript
JS操作Cookies包括(读取添加与删除)
2012/12/26 Javascript
用js判断输入是否为中文的函数
2014/03/10 Javascript
js 左右悬浮对联广告特效代码
2014/12/12 Javascript
AngularJS入门教程引导程序
2016/08/18 Javascript
本地Bootstrap文件字体图标引入却无法显示问题的解决方法
2020/04/18 Javascript
ES6新特性之Symbol类型用法分析
2017/03/31 Javascript
使用bootstrap插件实现模态框效果
2017/05/10 Javascript
JS和JQuery实现雪花飘落效果
2017/11/30 jQuery
对node.js中render和send的用法详解
2018/05/14 Javascript
Vue+ElementUI项目使用webpack输出MPA的方法
2019/08/27 Javascript
js canvas实现俄罗斯方块
2020/10/11 Javascript
利用vue3+ts实现管理后台(增删改查)
2020/10/30 Javascript
[14:25]教你分分钟做大人:主宰(HEROS)
2014/12/08 DOTA
举例详解Python中threading模块的几个常用方法
2015/06/18 Python
Python利用正则表达式匹配并截取指定子串及去重的方法
2015/07/30 Python
Pandas 按索引合并数据集的方法
2018/11/15 Python
Django+Xadmin构建项目的方法步骤
2019/03/06 Python
Pandas数据离散化原理及实例解析
2019/11/16 Python
PyCharm取消波浪线、下划线和中划线的实现
2020/03/03 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
2020/04/24 Python
css3 中实现炫酷的loading效果
2019/04/26 HTML / CSS
CSS3 网页下拉菜单代码解释 中文翻译
2010/02/27 HTML / CSS
HTML5本地存储和本地数据库实例详解
2017/09/05 HTML / CSS
林清轩官方网站:山茶花润肤油开创者
2016/10/26 全球购物
UNIX特点都有哪些
2016/04/05 面试题
中学教师师德师风演讲稿
2014/08/22 职场文书
2014年社区党建工作汇报材料
2014/11/02 职场文书
土木工程生产实习心得体会
2016/01/22 职场文书
标准发言稿结尾
2019/07/18 职场文书
一篇文章带你学习Mybatis-Plus(新手入门)
2021/08/02 Java/Android