发布/订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
pub即publish,出版、发布;publisher,发布者。
sub即subscribe,订阅;subscriber,订阅者。
订阅者订阅某个channel(频道),发布者将消息发布到某个频道,redis服务器将消息推送给这个频道的所有订阅者。
channel 管道、通道、频道。
发布者、订阅者都是redis的客户端,每个redis客户端都可以是发布者,往某个频道中发布消息。
Redis的消息是在线即时消息,类似于广播,只有在线的订阅者(连接到Redis服务器的客户端),才会收到消息。
若当时不在线,并不会收到消息。后面登陆了(连接到服务器),服务器也不会推送之前(这个客户端未收到)的消息。服务器只推送一遍。
使用示例
1、启动一个redis客户端,连接到服务器,订阅频道
subscribe channel1 #订阅channel1
一个条目用3项表示:
(1)"subscribe" 这个条目是一个订阅的频道
(2)频道名
(3)这个频道是当前客户端订阅的第几个频道
订阅之后,当前标签页会一直阻塞,等待接收Redis服务器推送的消息。
2、另起一个标签页,再运行一个redis客户端,连接redis服务器,推送消息
publish channel1 "hello" #向channel1里推送一条消息,消息内容是hello
返回接收到此消息的订阅者数量。
每个客户端都可以往某个频道中发送消息,这些消息由redis服务器推送给所有在线的、订阅了此频道的客户端。
3、切换到另一个标签页,看到订阅channel1的客户端已经接受到消息:
(1)“message” 表示这是一条消息
(2)这条消息来自哪个频道
(3)消息内容
此客户端订阅了哪些频道,这些信息保存在redis服务器上,关闭与redis服务器的连接,redis服务器会删除该连接(该客户端的信息),订阅了哪些频道,这些信息就没了。
即订阅只在本次连接期间有效。
发布/订阅的相关命令
subscribe channel1 channel2 #订阅一个或多个频道
psubscribe CCTV1 #p即pattern,用正则表达式指定要订阅的频道,会订阅所有匹配的频道
psubscribe CCTV* #订阅所有以CCTV开头的频道
psubscribe *TV #订阅所有以TV结尾的频道
psubscribe CCTV* CNTV* #可以指定多个匹配模式,订阅以CCTV开头的所有频道、订阅所有以CNTV开头的所有频道
unsubscribe channel1 channel2 #退订一个或多个频道
punsubscribe CCTV* CNTV* #退订以CCTV开头的所有频道、退订以CNTV开头的所有频道
publish channel1 "hello" #往某个频道里推送消息