试验环境:
- centos7.6x64位,CentOS-7-x86_64-Minimal-1810.iso
百度网盘下载地址:https://pan.baidu.com/s/1ckjQS_DGuI-7GGvmvhLNKQ 提取码: 6gfc
linux的安装参照:centos7.6最小化安装 - redis-5.0.5.tar.gz
官网下载地址:http://download.redis.io/releases/redis-5.0.5.tar.gz
百度网盘下载地址:https://pan.baidu.com/s/1ipnB043h5Tvk7cYGKxSr8g 提取码: bdkh
参照:
一、概念说明
发布和订阅其实就像是你声明一下自己订阅了哪个报纸,这样报纸印发了就会自动送到你这里来。
redis操作要点:
- 使用多个客户端同时连接到redis服务,在任意一个客户端上可以一次性声明要订阅的一个或多个频道,然后这个客户端就进入了阻塞状态。
- 在另外的客户端上发布一条消息到指定的频道,这时会发现订阅这个频道的客户端上会立即显示消息内容
- 频道的创建和消失是自动的,具体来说:当存在客户端订阅xxxx频道时,xxxx频道就存在;当不存在客户端订阅xxxx频道时,就认为xxxx频道消失了。
模型图示(摘自:https://www.runoob.com/redis/redis-pub-sub.html):
二、操作实例
2.1 同时打开四个redis客户端(A/B/C/D),如下图所示:
2.2 客户端A订阅两个频道(back.java、back.c#),进入阻塞状态
127.0.0.1:6500> subscribe back.java back.c#
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "back.java"
3) (integer) 1
1) "subscribe"
2) "back.c#"
3) (integer) 2
2.3 客户端B订阅两个频道(web.html web.css ),进入阻塞状态
127.0.0.1:6500> subscribe web.html web.css
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "web.html"
3) (integer) 1
1) "subscribe"
2) "web.css"
3) (integer) 2
2.4 客户端C订阅了3个模式(back.* web.* news.yule),进入阻塞状态
127.0.0.1:6500> psubscribe back.* web.* news.yule
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "back.*"
3) (integer) 1
1) "psubscribe"
2) "web.*"
3) (integer) 2
1) "psubscribe"
2) "news.yule"
3) (integer) 3
2.2~2.4操作后,界面如下:
2.5 客户端D查看redis服务上订阅的频道数量:pubsub channels
127.0.0.1:6500> pubsub channels
1) "web.html"
2) "back.c#"
3) "back.java"
4) "web.css"
注意:这里查看的是订阅的频道,那么【back.*】、【web.*】和【news.yule】这三个模式是不在里面的。
2.6 客户端D查看redis服务给定频道的订阅者数量:pubsub numsub back.java web.html
127.0.0.1:6500> pubsub numsub back.java web.html
1) "back.java"
2) (integer) 1
3) "web.html"
4) (integer) 1
127.0.0.1:6500> pubsub numsub
(empty list or set)
127.0.0.1:6500> pubsub numsub back.*
1) "back.*"
2) (integer) 0
注意:这里必须写上具体的频道名称,不写的话返回的是空结果。
另外:频道名称和模式不同,这里写“back.*”是不会有结果的。
2.7 客户端D查看订阅模式的数量:pubsub numpat
127.0.0.1:6500> pubsub numpat
(integer) 3
注意:这里的三个模式就是客户端C使用“psubscribe”命令订阅的三个模式:
- back.*
- web.*
- news.yule
2.8 客户端D发布消息到back.java频道:publish back.java “java is a good language”
127.0.0.1:6500> publish back.java "java is a good language"
(integer) 2
发布后能看到A端、C端立即显示了发布的消息,如下图:
2.9 指示客户端退订某个频道:unsubscribe back.java back.c#
在实验的时候,发现客户端并没有退订频道,具体表现为:
执行unsubscribe 命令后,订阅的客户端没有反应,当publish消息到unsubscribe的频道后,客户端仍然能接收到消息。。。
这里可以认为:
当客户端退出或主动退订的时候才会生效,redis服务端无法主动退订频道。
2.10 指示客户端退订某个模式:punsubscribe back.*
和2.9中类似的问题,暂时也认为服务端无法主动退订模式频道吧。