有一些应用场景,比如下完订单后,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
服务中了: