gpt4 book ai didi

基于Redis过期事件实现订单超时取消

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章基于Redis过期事件实现订单超时取消由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

订单超时取消的实现,首先想到的是定时任务,但是这种实现方式在订单量较大的情况下是有问题的,而且时间也会有误差,最大时间差就是定时任务的执行间隔时间.

使用redis的过期监听事件可以比较好的解决这个问题。实现的方式是订单创建后向redus中存一记录,一般就以订单号为key。设置过期时间(订单超时时间),一旦时间超时会触发监听事件,这时候就可以通过key判断这个订单是否支付,未支付时取消订单.

redis过期监听的实现:

  。

1.修改redis.windows.conf配置文件中notify-keyspace-events的值 。

默认配置notify-keyspace-events的值为" ",修改为 notify-keyspace-events ex 这样便开启了过期事件 。

基于Redis过期事件实现订单超时取消

2. 创建配置类redislistenerconfig(配置redismessagelistenercontainer这个bean) 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@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所有过期事件的监听.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@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 订单超时取消内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。

原文链接:https://fengkay.blog.csdn.net/article/details/103718072 。

最后此篇关于基于Redis过期事件实现订单超时取消的文章就讲到这里了,如果你想了解更多关于基于Redis过期事件实现订单超时取消的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com