有一些应用场景,比如下完订单后,20分钟没有付款,可以取消订单。这里会用到延迟消息队列。由于不想维护各种
MQ,如果你的项目里面用了redis的话,可以选择利用redis的特性来实现延迟消息队列。
设计原理:
原理实际上就是,当一条Message消息发送过来时,以String类型存储到redis数据库中。再没有消费之前,就讲key放到zset类型中排个队,称之为消息队列。然后将拍好队的消息取出来,按顺序放进List当中。之后的消费取出的消息,实际上都是从List中取出来的。图形表示如下:

项目地址:https://gitee.com/olysa/redismq
项目结构:
├─redismq-common //生产者和消费者公用代码,比如队列信息和redis配置信息
│ ├─src
│ │ ├─main
│ │ │ ├─java
│ │ │ │ └─com
│ │ │ │ └─sqlb
│ │ │ │ └─redismq
│ │ │ │ └─common
│ │ │ │ ├─config //存放mq的消费队列胚子信息
│ │ │ │ ├─msmq //核心mq代码
│ │ │ │ └─utils //操作redis的工具类
│ │ │ └─resources
│ │ │ └─configure
├─redismq-consumer //消费者
│ ├─src
│ │ ├─main
│ │ │ ├─java
│ │ │ │ └─com
│ │ │ │ └─sqlb
│ │ │ │ └─redismq
│ │ │ │ └─consumer
│ │ │ │ └─task //包含定时任务,用来消费队列消息
│ │ │ └─resources
└─redismq-product //生产者
├─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─sqlb
│ │ │ └─redismq
│ │ │ └─product
│ │ │ └─controller //产生消息的生产者
│ │ └─resources
redis 安装: 本人是基于centos7安装的。可以参考 Redis安装和常见问题解决 。
使用说明:
- 先启动
redismq-consumer工程:

然后启动
redismq-product工程:

然后去生产一条消息,浏览器端输入
http://localhost:8082/postMsg?msg=都让开,我要发消息了:
redismq-consumer工程在延迟20s之后就会消费此消息了。

同时可以看到,生产的那条消息已经存储到
redis服务中了:


本文介绍如何利用Redis特性实现延迟消息队列,通过存储消息并利用ZSet进行排序,进而实现消息的延迟消费。适用于如订单超时取消等场景。
2036

被折叠的 条评论
为什么被折叠?



