消息队列

消息队列

消息队列主要分为两种,分别是生产者消费者模式和发布者订阅者模式,这两种模式Redis都支持。消息队列主要用于公司的服务创建和服务搭建等等。生产中主要使用生产者和消费者模式。

3.5.1 生产者消费者模式

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

3.5.1.1 模式介绍

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

3.5.1.2 队列介绍

队列当中的消息由不同的生产者写入也会有不同的消费者取出进行消费处理,但是一个消息一定是只能被取出一次也就是被消费一次。是为了防止写入数据重复。

3.5.1.3 生产者发布消息

我在一个终端中写入 channel1 这个队列 4 个 masg 消息

# 从左侧写入 msg1 1、2、3、4 这 4 个消息到 channel1 这个表中
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> LPUSH channel1 msg4
(integer) 4

3.5.1.4 查看队列所有消息

# 通过 LRANGE 查看 channle1 这个表中的值,并且取 0 -1 就会将所有的数据取出
127.0.0.1:6379> LRANGE channel1 0 -1
1) "msg4"
2) "msg3"
3) "msg2"
4) "msg1"

3.5.1.5 消费者消费消息

这里我消费了两个 msg1 和 msg2 队列,因为一个消息队列只能被消费一次,所以就会消失。

# 从管道的右侧消费
127.0.0.1:6379> RPOP channel1
"msg1"
127.0.0.1:6379> RPOP channel1
"msg2"

# 再次验证消息队列就会发现 msg1、msg2 已经被消费,所以消失了
127.0.0.1:6379> LRANGE channel1 0 -1
1) "msg4"
2) "msg3"

3.5.2 发布者订阅模式

3.5.2.1 模式介绍

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

此模式常用语群聊天、群通知、群公告等场景。
Subscriber:订阅者
Publisher:发布者
Channel:频道

3.5.2.2 订阅者监听频道

在前台执行

127.0.0.1:6379> SUBSCRIBE channel1              # 订阅者订阅指定 channel1 的频道
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1

3.5.2.3 发布者发布消息

1、开启另外的一个终端,进入到 redis 中,并且在 channle1 这个频道发布两条消息

# 使用密码登录
[15:59:02 root@redis-server ~]#redis-cli -a 12345

# 发布消息 test1 到 channle1 这个频道中
127.0.0.1:6379> PUBLISH channel1 test1
(integer) 1

# 发布消息 test2 到 channle1 这个频道中
127.0.0.1:6379> PUBLISH channel1 test2
(integer) 1

3.5.2.4 订阅者验证消息

回到我们订阅者监听的终端中,就会发现多了两个消息分别是 test1 和 test2

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

3.5.2.5 订阅多个频道

127.0.0.1:6379> SUBSCRIBE channel1 channel2

3.5.2.6 订阅所有频道

127.0.0.1:6379> PSUBSCRIBE *

3.5.2.7 订阅匹配频道

# 我们这里订阅的是匹配的是 chann 开头的所有频道
127.0.0.1:6379> PSUBSCRIBE chann*
点赞