消息队列主要分为两种,分别是生产者消费者模式和发布者订阅者模式,这两种横式Redis都支持。

1、生产者消费者模式:

在生产者消费者(Producer/Consumer)模式下,上层应用接收到的外部请求后开始处理其当前步骤的操作,在执行完成后将已经完成的操作发送至指定的频道(channel)当中,并由其下层的应用监听该频道并继续下一步的操作,如果其处理完成后没有下一步的操作就直接返回数据给外部请求,如果还有下一步的操作就再将任务发布到另外一个频道,由另外一个消费者继续监听和处理。

1,1、模式介绍

生产者消费者横式下,多个消费者同时监听一个队里,但是一个满息只能被最先抢到消息的消费者消费,即消息任务是一次性读取和处理,此模式在分布式业务架构中非常常用,比较常用的软件还有RabbitMQ、Kafka、RocketMQ,ActiveMQ等。

redis消费者并发 redis消费队列_redis

在这里A作为一个生产者,B需要订阅A的返回消息,所以B是A的消费者,C又需要订阅B的消息,所有B对于C又是生产者,C是B的消费者。生产者和消费者都是相对的。生产者会把用户的消息封装好,一般用json格式进行封装。

1.2、消息队列

队列当中的消息由不同的生产者写入也会有不同的消费者取出进行消费处理,但是一个消息一定是只能被取出一次也就是被消费一次,所以此处用list类型比较好。

1.3、写入数据

127.0.0.1:6379[1]> lpush channel1 msg1 msg2 msg3 msg4 msg5
(integer) 5
127.0.0.1:6379[1]> lrange channel1 0 -1
1) "msg5"
2) "msg4"
3) "msg3"
4) "msg2"
5) "msg1"

1.4、消费消费者消息

# 直接从右侧取数据
127.0.0.1:6379[1]> rpop channel1
"msg1"
127.0.0.1:6379[1]> rpop channel1
"msg2"
127.0.0.1:6379[1]> rpop channel1
"msg3"
127.0.0.1:6379[1]> rpop channel1
"msg4"
127.0.0.1:6379[1]> rpop channel1
"msg5"
127.0.0.1:6379[1]> rpop channel1
(nil)

1.5、验证消费者消息队列数据

127.0.0.1:6379[1]> lrange channel1 0 -1
(empty list or set)

我们发现消费者消息已经被消费完了

生产消费者模式: 是一对一的,就是说由生产者生产出消息,只能有一个消费者进行消费,一旦消费完了该消息就不存在了,但是不存在绑定关系,例如,有生产者A生产一个消息,可以由B1或者B2来进行消费,如果一旦由B1进行了消费,B2就无法在进行消费了,无法提供个第二个消费者进行消费,我们这边说的生产者和消费者通常指的是内部服务。

一般用redis实现消息队列的场景不多,通常我们会用专门的消息队列组件进行实现,例如kafka、RabbitMQ等。

2、发布者订阅模式:

2.1、模式介绍

在发布者订阅者模式下,发布者将消息发布到指定的channel里面,凡是监听该channel的消费者都会收到同样的一份消息,这种模式类似于是收音机的广播模式,即凡是收听某个频道的听众都会收到主持人发布的相同的消息内容。

此模式常用语群聊天、群通知、群公告等场景。如:通过微信订阅了某某公众号,公众号会推送一些优秀的文章,推送完后,所有订阅该公众号的用户均可收到该公众号推送的文章。在如:微信群,当群主在群里发一个消息或者公告,其他所有成员均可查看,并且可以多次重复查看。

Subscriber:订阅者
Publisher:发布者
channel:频道

redis消费者并发 redis消费队列_redis_02

订阅者模式: 一对多,可以多人用户同时进行消费,可以多次进行消费。

2.2、订阅者监听频道

# 第一个订阅者订阅channel3
127.0.0.1:6379[1]> SUBSCRIBE channel3
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel3"
3) (integer) 1

生产者进行发布

127.0.0.1:6379[1]> PUBLISH channel3 msg1
(integer) 1
127.0.0.1:6379[1]> PUBLISH channel3 msg2
(integer) 1

查看订阅者已经接收到发布者发布的消息了

127.0.0.1:6379[1]> SUBSCRIBE channel3
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel3"
3) (integer) 1
1) "message"
2) "channel3"
3) "msg1"
1) "message"
2) "channel3"
3) "msg2"

此时第二个订阅者进行订阅

# 第二个订阅者订阅channel3
127.0.0.1:6379[1]> SUBSCRIBE channel3
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel3"
3) (integer) 1

第二个订阅者是接收不到发布者之前发布的消息,只能看到自订阅之时以后的消息

发布者再次发布消息

127.0.0.1:6379[1]> PUBLISH channel3 msg3
(integer) 2

第一个订阅者

127.0.0.1:6379[1]> SUBSCRIBE channel3
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel3"
3) (integer) 1
1) "message"
2) "channel3"
3) "msg1"
1) "message"
2) "channel3"
3) "msg2"
1) "message"
2) "channel3"
3) "msg3"

第二个订阅者

127.0.0.1:6379[1]> SUBSCRIBE channel3
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel3"
3) (integer) 1
1) "message"
2) "channel3"
3) "msg3"

一个订阅者可以订阅多个频道

127.0.0.1:6379> SUBSCRIBE channel1 channel2
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
1) "subscribe"
2) "channel2"
3) (integer) 2

可订阅所有频道

127.0.0.1:6379> PSUBSCRIBE *
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "*"
3) (integer) 1

订阅匹配的频道

127.0.0.1:6379> PSUBSCRIBE channel*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "channel*"
3) (integer) 1

说明: 笔记是参考马哥视频整理出来的,如有侵权请联系删除!