消息队列
消息队列: 把要传输的数据放在队列中,从而实现应用之间的数据交换
常用功能: 可以实现多个应用系统之间的解耦,异步,削峰/限流等
常用的消息队列应用: Kafka,RabbitMQ,Redis
消息队列分为两种
- 生产者/消费者模式: Producer/Consumer
- 发布者/订阅者模式: Publisher/Subscriber
1. 生产者消费者模式
1.1 模式说明
生产者消费者模式下,多个消费者同时监听一个频道(redis用队列实现),但是生产者产生的一个消息只能被最先抢到消息的一个消费者消费一次,队列中的消息由可以多个生产者写入,也可以有不同的消费者取出进行消费处理.此模式应用广泛
1.2 生产者生成消息
# 从管道的左侧写入
127.0.0.1:6379> lpush channel1 msg1
(integer) 1
127.0.0.1:6379> lpush channel1 msg2
(integer) 2
127.0.0.1:6379> lpush channel1 msg3
(integer) 3
127.0.0.1:6379> type channel1
list
1.3 获取所有消息
127.0.0.1:6379> lrange channel1 0 -1
1) "msg3"
2) "msg2"
3) "msg1"
1.4 消费者消费消息
# 基于实现消息队列的先进先出原则,从管道的右侧消费
127.0.0.1:6379> rpop channel1
"msg1"
127.0.0.1:6379> rpop channel1
"msg2"
127.0.0.1:6379> rpop channel1
"msg3"
127.0.0.1:6379> rpop channel1
(nil)
1.5 验证队列消息消费完成
# 验证队列中的消息全部消费完成
127.0.0.1:6379> lrange channel1 0 -1
(empty array)
2. 发布者订阅模式
2.1 模式说明
在发布者订阅者Publisher/Subscriber模式下,发布者Publisher将消息发布到指定的频道channel,事先监听此channel的一个或多个订阅者Subscriber都会收到相同的消息。即一个消息可以由多个订阅者获取到 对于社交应用中的群聊、群发、群公告等场景适用于此模式
2.2 订阅者订阅频道
# 另打开一个终端当作订阅者 (也可以多开几个终端当订阅者)
127.0.0.1:6379> subscribe channel2
1) "subscribe"
2) "channel2"
3) (integer) 1
Reading messages... (press Ctrl-C to quit or any key to type command)
2.3 发布者发布消息
# 发布者发布信息到指定频道
127.0.0.1:6379> publish channel2 msg1
(integer) 1 # 订阅者个数
2.4 各个订阅者都能收到消息
# 在另一个打开的终端查看
127.0.0.1:6379> subscribe channel2
1) "subscribe"
2) "channel2"
3) (integer) 1
1) "message"
2) "channel2"
3) "msg1"
Reading messages... (press Ctrl-C to quit or any key to type command)
2.5 订阅多个频道
127.0.0.1:6379> SUBSCRIBE channel2 channel22
2.6 订阅所有频道
127.0.0.1:6379> PSUBSCRIBE *
2.7 订阅匹配的频道
127.0.0.1:6379> PSUBSCRIBE chann*
2.8 取消订阅频道
127.0.0.1:6379(subscribed mode)> unsubscribe channel2
1) "unsubscribe"
2) "channel2"
3) (integer) 0