文章目录

1.列表list的发布订阅模式的局限性

前面我们说通过队列的rpush 和lpop 可以实现消息队列(队尾进队头出),但是消费者需要不停地调用lpop查看List 中是否有等待处理的消息
(比如写一个 while 循环)。为了减少通信的消耗,可以sleep()一段时间再消费,但是会有两个问题:
1.如果生产者生产消息的速度远大于消费者消费消息的速度,List 会占用大量的内存。
2.消息的实时性降低。
list 还提供了一个阻塞的命令:blpop,没有任何元素可以弹出的时候,连接会被阻塞。
3.基于list 实现的消息队列,不支持一对多的消息分发。
所谓不支持消息分发,就是主动通知的功能;

blpop命令使用参考
​​​http://redisdoc.com/list/blpop.html​

2.redis的发布订阅模式

2.1.概述

1.首先,我们有很多的频道(channel),我们也可以把这个频道理解成queue队列。
2.订阅者可以订阅一个或者多个频道。消息的发布者(生产者)可以给指定的频道发布消息。只要有消息到达了频道,
所有订阅了这个频道的订阅者都会收到这条消息。
3.需要注意的注意是,发出去的消息不会被持久化,因为它已经从队列里面移除了,所以消费者只能收到它开始订阅这个频道之后发布的消息。

2.2.相关命令

2.2.1.客户端订阅频道消息

2.2.1.1.完全匹配:subscribe name

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

2.2.1.2.规则匹配:支持?和*占位符。?代表一个字符,*代表 0 个或者多个字符。

一定要注意,规则匹配不是SUBSCRIBE而是PSUBSCRIBE

2.2.1.2.1.规则匹配 ?代表一个字符:PSUBSCRIBE ?ame

客户端A

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

发布端B

127.0.0.1:6379> publish name gaoxinfu
(integer) 4
127.0.0.1:6379>

上面发布端B执行完成之后,客户端A会有如下变化

127.0.0.1:6379> PSUBSCRIBE ?ame
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "?ame"
3) (integer) 1
1) "pmessage"
2) "?ame"
3) "name"
4) "gaoxinfu"

redis之发布订阅模式_发布订阅

2.2.1.2.2.规则匹配 *代表 0 个或者多个字符:PSUBSCRIBE *sports

客户端A

localhost:~ gaoxinfu$ /usr/local/bin/redis-cli 
127.0.0.1:6379> PSUBSCRIBE *sports
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "*sports"
3) (integer) 1
1) "pmessage"
2) "*sports"

发布端B

127.0.0.1:6379> publish football-sports football
(integer) 1
127.0.0.1:6379> publish basketball-sports basketball
(integer) 1
127.0.0.1:6379>

上面发布端B执行完成之后,客户端A会有如下变化

localhost:~ gaoxinfu$ /usr/local/bin/redis-cli 
127.0.0.1:6379> PSUBSCRIBE *sports
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "*sports"
3) (integer) 1
1) "pmessage"
2) "*sports"
3) "football-sports"
4) "football"
1) "pmessage"
2) "*sports"
3) "basketball-sports"
4) "basketball"

redis之发布订阅模式_发布订阅_02

2.2.2.发布者发布频道消息:publish name gaoxinfu

127.0.0.1:6379> publish name gaoxinfu
(integer) 1
127.0.0.1:6379>

消息发布完成之后,订阅消息的接收端,会收到发布的内容

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

redis之发布订阅模式_发布订阅_03

当然上面的客户端,只要订阅了都可以接收到消息内容,所以多个客户端可以同时订阅channel频道

2.2.3.客户端取消订阅频道消息:unsubscribe name (这个不能再订阅的模式去执行)