Redis还是一个稳定、快速的发布/订阅消息系统。订阅者可以订阅一个或多个他们感兴趣的channel,当发布者将消息发送到指定的channel中之后,订阅者就会收到消息。
1.发布/订阅
发布/订阅模式可以实现发布者和订阅者之间的解耦,提供了灵活的伸缩性和扩展性。比如,发布者将消息发布到指定的channel中,而不需要去关心有谁订阅了这个channel;同样地,订阅者订阅一个或多个他们所感兴趣的channel,却不用去关心有哪些发布者。
(1)订阅
Redis提供的SUBSCRIBE命令可以用来订阅一个或多个channel,命令格式如下所示:
1 |
SUBSCRIBE channel [channel ...] |
比如,订阅foo:
1 2 3 4 5 |
127.0.0.1:6379> SUBSCRIBE foo Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "foo" 3) (integer) 1 |
其中,返回值是一个三元组的消息:”subscribe”表示成功订阅;”foo”表示订阅的channel名为foo;(integer) 1表示客户端目前订阅了多少个channel。
订阅之后,一旦有发布者将消息发布到foo中之后,订阅者将会收到相应的信息。需要注意的是,处于订阅状态中的客户端不应该再发出任何命令(如上示例,redis-cli客户端在订模式下不能接受任何命令,只能使用Ctrl-C退出订阅模式)。
(2)发布
使用PUBLISH命令,可以向指定channel中发布消息,命令格式如下:
1 |
PUBLISH channel message |
比如,向foo中发布一条消息:
1 2 |
127.0.0.1:6379> PUBLISH foo "hello world" (integer) 1 |
此时,订阅者将接收到以下信息:
1 2 3 |
1) "message" 2) "foo" 3) "hello world" |
其中,”message”表示接收到其他客户端使用PUBLISH命令发布的消息;”foo”表示此消息来源的channel;”hello world”则表示的是消息实体。
(3)取消订阅
取消订阅则使用UNSUBSCRIBE命令,命令格式:
1 |
UNSUBSCRIBE [channel [channel ...]] |
2.模式匹配
还记得在RabbitMQ入门系列的教程中topic类型的交换器特性吗?Redis也实现了模式匹配功能,客户端通过模式匹配功能,可以实现个性化订阅。
(1)PSUBSCRIBE
1 |
PSUBSCRIBE pattern [pattern ...] |
使用PSUBSCRIBE命令可以实现模式匹配订阅功能,例如:
1 2 3 4 5 |
127.0.0.1:6379> PSUBSCRIBE user.* Reading messages... (press Ctrl-C to quit) 1) "psubscribe" 2) "user.*" 3) (integer) 1 |
订阅所有符合“user.*”的channel,这样一来,发布到诸如user.info、user.warning等channel的消息都将会被此订阅者接收到。
(2)PUNSUBSCRIBE
1 |
PUNSUBSCRIBE [pattern [pattern ...]] |
该命令可以取消相应的模式匹配订阅:
1 2 3 4 |
127.0.0.1:6379> PUNSUBSCRIBE user.* 1) "punsubscribe" 2) "user.*" 3) (integer) 0 |
需要注意的是,如果客户端同时使用SUBSCRIBE和PSUBSCRIBE命令订阅了同一个channel,那么订阅者将会接收到分别来自SUBSCRIBE订阅的channel发来的消息和PSUBSCRIBE订阅的channel发来的消息。
比如,订阅者这样订阅了channel:
1 2 |
SUBSCRIBE foo PSUBSCRIBE f* |
那么,如果发布者将消息发布到foo中,订阅者就会接收两条消息体一样的消息。
3.其他
使用PUBSUB命令可以查看当前发布/订阅系统的状态。
(1)命令格式
1 |
PUBSUB subcommand [argument [argument ...]] |
(2)示例
查看当前发布/订阅系统的状态:
1 2 |
127.0.0.1:6379> PUBSUB channels (empty list or set) |
表示当前无任何客户端处于订阅状态,若将一个客户端进入订阅状态:
1 2 3 4 5 |
127.0.0.1:6379> SUBSCRIBE foo Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "foo" 3) (integer) 1 |
此时,再查看发布/订阅系统的状态:
1 2 |
127.0.0.1:6379> PUBSUB channels 1) "foo" |
表示当前channel名为foo的通道正在被订阅中。
参考:
https://redis.io/topics/pubsub
炎热夏天,闲来无事,拜读博客,消暑解闷!