redis 发布与定阅

直接看发布与定阅,容易让人迷糊。什么发布者和消息订阅者之间的耦合,什么通道,


先看下面的表格,等你照着做一遍就知道是怎么回事了。(linux  平台下)

先启动~$ redis-server

启动一个client1

在启动 client2

在启动 client3

然后对应下面的表进行输入红色的命令,注意观察每个客户端的显示

NOTE:

Client (一个命令行窗口就叫一个client) redis-cli命令就是启动一个客户端



Client 1(一个命令行窗口就叫一个client)

Client 2

Client 3



redis 127.0.0.1:6379>subscribe tv1

Reading messages... (press Ctrl-C to quit)

1) "subscribe"

2) "tv1"

3) (integer) 1

redis 127.0.0.1:6379>subscribe tv1 tv2

Reading messages... (press Ctrl-C to quit)

1) "subscribe"

2) "tv1"

3) (integer) 1

1) "subscribe"

2) "tv2"

3) (integer) 2






redis 127.0.0.1:6379>publish tv1 program1

(integer) 2

redis 127.0.0.1:6379>



redis 127.0.0.1:6379> subscribe tv1

Reading messages... (press Ctrl-C to quit)

1) "subscribe"

2) "tv1"

3) (integer) 1

1) "message"

2) "tv1"

3) "program1"

redis 127.0.0.1:6379> subscribe tv1 tv2

Reading messages... (press Ctrl-C to quit)

1) "subscribe"

2) "tv1"

3) (integer) 1

1) "subscribe"

2) "tv2"

3) (integer) 2

1) "message"

2) "tv1"

3) "program1"






redis 127.0.0.1:6379>publish tv2 program2

(integer) 1

redis 127.0.0.1:6379>



redis 127.0.0.1:6379> subscribe tv1

Reading messages... (press Ctrl-C to quit)

1) "subscribe"

2) "tv1"

3) (integer) 1

1) "message"

2) "tv1"

3) "program1"

redis 127.0.0.1:6379> subscribe tv1 tv2

Reading messages... (press Ctrl-C to quit)

1) "subscribe"

2) "tv1"

3) (integer) 1

1) "subscribe"

2) "tv2"

3) (integer) 2

1) "message"

2) "tv1"

3) "program1"

1) "message"

2) "tv2"

3) "program2"



正式的解释来了,先看命令。

SUBSCRIBE

英文的意思就是定阅,这里也是定阅

client1 >subscribe tv1  tv1就是我要定阅,关注它的相关信息,就是你有什么事,我都可以知道。就和关注明星微博一样,你是他的粉丝了,他要是发个微博,拍了个照片,你是不是就有提示你去看。问题是明星哪里来的那,tv1总不能胡编乱造吧,等会就知道了。

client2>subscribe tv1 tv2     我喜欢好几个明星,那我就关注好几个,只要我想关注的我就关注,于是我就关注了  tv1 tv2


client3>publish tv1 program1     明星来了,publish就是定义明星(publish其实是发布的意思,明星就是频道的意思,频道就是影视频道,娱乐频道,法制频道),这句话连起来就是 定义了一个明星,明星说了句 program1.


client1>刚才谁关注了tv1了,是client1吧。于是就收到了tv1明星的话,

                1) "message"   代表是收消息

                2) "tv1"            我关注了谁,哪个明星在活动

                3) "program1"    这个明星干了嘛


client2>我也关注了 tv1啊,不能把我丢下。于是他也收到了tv1 说的话      

            1) "message"

            2) "tv1"

            3) "program1"

client3>这时,客户端3又一位明星发布了一句话(publish tv2 program2) ,是又一位明星哦。它说了句program2

                    谁关注了新明星那,只有客户端2

client1>

client2我收到了新明星tv2的消息                 

                    1) "message"

                    2) "tv2"

                    3) "program2"



信息的格式:

redis 127.0.0.1:6379[2]> subscribe tv1      #  关注tv1
Reading messages... (press Ctrl-C to quit)      #提示你Ctrl C 退出,退出就收不到信息了
1) "subscribe"              #  代表 是定阅
2) "tv1"                          #定阅频道
3) (integer) 1                #  成功执行了一次定阅,也代表关注了一个频道,你可以看客户端2的区别
1) "message"               #代表接受信息
2) "tv1"                           #接受谁的,肯定是你关注其中之一的
3) "program1"             #频道发布的内容


redis 127.0.0.1:6379> publish tv1 program1   #发布一个频道 和信息
(integer) 2        #有几个人在关注频道tv1


订阅模式

redis> PSUBSCRIBE news.*

客户端将收到来自 news.art.figurative  news.music.jazz 等频道的信息。

客户端订阅的模式里面可以包含多个 glob 风格的通配符, 比如 *  ?  [...] , 等等

redis> PUNSUBSCRIBE news.*

将退订 news.* 模式, 其他已订阅的模式不会被影响。

通过频道和模式接收同一条信息

如果客户端订阅的多个模式匹配了同一个频道, 或者客户端同时订阅了某个频道、以及匹配这个频道的某个模式, 那么它可能会多次接收到同一条信息。

举个例子, 如果客户端执行了以下命令:

SUBSCRIBE foo
PSUBSCRIBE f*

那么当有信息发送到频道 foo 时, 客户端将收到两条信息: 一条来自频道 foo ,信息类型为 message ; 另一条来自模式 f* ,信息类型为pmessage 

订阅总数

在执行 SUBSCRIBE  UNSUBSCRIBE  PSUBSCRIBE  PUNSUBSCRIBE 命令时, 返回结果的最后一个元素是客户端目前仍在订阅的频道和模式总数。

当客户端退订所有频道和模式, 也即是这个总数值下降为 0 的时候, 客户端将退出订阅与发布状态。


你可能感兴趣的:(redis 发布与定阅)