一、相关命令概览
1.subscribe 订阅消息
2.psubscribe 利用模式匹配订阅消息
3.publish 发布消息
4.unsubscribe 取消普通订阅
5.punsubscribe 取消模式匹配的订阅
6.pubsub 自省命令
二、发布订阅的作用
发布者无需将消息发送给特定的订阅者,而是将消息发送给某一频道,发布者并不关心订阅者是谁,与此同时,订阅者也不关心它所订阅频道的发布者是谁,只关注它自己订阅的频道消息。这种模式的发布者和订阅者之间不存在耦合关系,允许更大的可移植性和动态网络拓扑。
该功能可以构建即时通信应用,比如网络聊天室(chatroom)和实时广播、实时提醒等。
三、六大命令使用详解
1.subscribe 订阅消息
开启两个redis数据库客户端,开启两个订阅者,均订阅message_1频道。
127.0.0.1:6379> subscribe message_1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "message_1"
3) (integer) 1
1) "message"
2) "message_1"
3) "string_1"
2.publish 发布消息
开启了两个redis客户端,分别订阅了message_1这个消息,当发布message_1消息时,返回结果为2,意味着有两个订阅者接收到消息。
[root@10-6-3-198 ~]# redis-cli
127.0.0.1:6379> publish message_1 string_1
(integer) 2
3.psubscribe 利用模式匹配订阅消息
开启另一个redis客户端,利用模式匹配的方式订阅频道,模式匹配字符串为message*,所以会订阅到message_1这个频道,由于之前已经有两个订阅者,所以此时发布者再发布消息,返回结果为3。
127.0.0.1:6379> psubscribe message*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "message*"
3) (integer) 1 # 订阅了1个频道
1) "pmessage" # 订阅消息的方式
2) "message*" # 匹配模式字符串
3) "message_1" # 具体匹配的频道
4) "string_2" # 接收到的消息
发布者的状态为:
127.0.0.1:6379> publish message_1 string_2
(integer) 3
4.unsubscribe 取消普通订阅
redis的客户端工具并不能实现该操作,订阅频道时,提示press Ctrl-C to quit,但是由于误操作,press Ctril-Z,导致某个redis客户端的订阅者并没有被取消,一直存在着。
解决方法是改变redis.conf配置参数client-output-buffer-limit,该参数的意义是
client-output-buffer-limit pubsub 32mb 8mb 60
5.punsubscribe 取消模式匹配的订阅
redis客户端工具同样不能操作。
6.pubsub 自省命令
pubsub是一种可以检查发布订阅子系统的自省命令。其子命令以及时间复杂度如下:
CHANNELS :O(N) , N 是活跃频道的数量,该命令返回活跃的频道列表。活跃指的是至少被一个订阅者订阅。
由于我已经取消了所有测试订阅,只有之前误操作ctrl+z的订阅者没有取消,所以有一下的结果,message_1频道有2个订阅者没有取消,new_1频道都正确取消了订阅。
127.0.0.1:6379> pubsub channels message_1
1) "message_1"
127.0.0.1:6379> pubsub channels new_1
(empty list or set)
NUMSUB :O(N),N是请求统计订阅数数目的频道的数量,下面语句的时间复杂度为O(2)。该语句只能统计非模式匹配类型的订阅者,如果语句中的订阅者包括*,则统计的结果为0,想要统计模式匹配的订阅者,需要使用NUMPAT子命令。
127.0.0.1:6379> pubsub numsub new_1 message_1
1) "new_1"
2) "0"
3) "message_1"
4) "2"
127.0.0.1:6379> pubsub numsub new_1 message_*
1) "new_1"
2) "0"
3) "message_*"
4) "0"
NUMPAT :O(1),统计模式所有匹配订阅者的数量。该命令无需频道或者模式匹配参数。返回所有订阅者的数量。
127.0.0.1:6379> pubsub numpat
(integer) 2