服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Redis - 基于Redis过期事件实现订单超时取消

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

2021-08-03 16:32WannaRunning Redis

这篇文章主要介绍了基于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实现用户积分排行榜的教程

    使用Redis实现用户积分排行榜的教程

    这篇文章主要介绍了使用Redis实现用户积分排行榜的教程,包括一个用PHP脚本进行操作的例子,需要的朋友可以参考下 ...

    Redis教程网4572019-10-23
  • Redis简单实用!利用Redis轻松实现高并发全局ID生成器

    简单实用!利用Redis轻松实现高并发全局ID生成器

    Redis作为高性能的KV数据库,并且操作还是原子性的,所以用来做支持高并发的发号器十分合适。 本文给大家介绍3种常见的全局ID生成方式。 1、全局递增...

    未知802023-05-07
  • RedisRedis面试题常见问答

    Redis面试题常见问答

    通常,我们会使用缓存用于缓冲对 DB 的冲击,如果缓存宕机,所有请求将直接打在 DB,造成 DB 宕机——从而导致整个系统宕机。...

    民工哥技术之路3082020-07-18
  • Redis浅谈Redis中的内存淘汰策略和过期键删除策略

    浅谈Redis中的内存淘汰策略和过期键删除策略

    本文主要介绍了浅谈Redis中的内存淘汰策略和过期键删除策略,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    纪先生9002021-11-14
  • Redis一次关于Redis内存诡异增长的排查过程实战记录

    一次关于Redis内存诡异增长的排查过程实战记录

    这篇文章主要给大家分享了一次关于Redis内存诡异增长的排查过程实战记录,文中通过示例代码介绍的非常详细,对大家学习或者使用Redis具有一定的参考学...

    付磊2962019-11-15
  • RedisRedis如何实现分布式锁

    Redis如何实现分布式锁

    相信大家对锁已经不陌生了,本文主要介绍了Redis如何实现分布式锁,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参...

    公众号程序员学长11082021-09-17
  • RedisWindows下Redis的安装使用教程

    Windows下Redis的安装使用教程

    这篇文章主要以图文结合的方式为大家详细介绍了Windows下Redis的安装使用,Redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对...

    CSDN3952019-10-29
  • RedisRedis挂了,流量把数据库也打挂了,怎么办?

    Redis挂了,流量把数据库也打挂了,怎么办?

    Redis 挂了,不就是缓存都没了吗?缓存都没了,不就是缓存雪崩了吗?缓存雪崩了,不就导致数据库挂了吗?一提到“缓存雪崩”这四个字,缓存穿透、缓存击...

    why技术8672021-08-11