Redis的发布订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。通过执行SUBSCRIBE命令,客户端可以订阅一个或多个频道,成为这些频道的订阅者(subscriber),当其他客户端向订阅的频道发送消息时,该频道的所有订阅者都可以收到这条消息信息。下图中,客户端A、客户端B、客户端C分别订阅了cctv.5频道。这时,某客户端执行如下命令:PUBLICH"cctv.5""中国男篮战胜美国男篮,夺得奥运冠军。"此时所有订阅了cctv.5频道的客户端都会收到这条消息。客户端除了订阅频道外,还可以通过执行PSUBSCRIBE命令订阅一个或多个模式,从而成为这些模式的订阅者。每当另一个客户端向通道发送消息时,消息不仅会发送给该通道的订阅者,还会发送给与该通道匹配的模式的订阅者。上图中,我们向cctv.3频道发送了一条消息“同一首歌”,消息会先发送给它的订阅者客户端A,然后根据模式匹配,cctv.3符合cctv.*模式.所以订阅了cctv.*频道的订阅者也可以收到新闻。(●′?`●)?频道订阅当客户端执行SUBSCRIBE命令订阅一个或多个频道时,客户端与订阅的频道之间建立订阅关系。Redis在服务器状态下将所有频道的订阅关系保存在pubsub_channels字典中。这个字典的key是一个订阅的频道,value是一个链表,记录了所有订阅这个频道的client。当客户端执行SUBSCRIBE命令订阅一个或多个频道时,服务器会将客户端与pubsub_channels字典中订阅的频道相关联。根据频道是否已经有其他订阅者,关联操作分为两种情况:如果频道已经有其他订阅者,那么pubsub_channels字典中一定有对应的订阅者列表。该程序唯一要做的就是将客户端添加到链表的末尾。该频道没有其他订阅者。该程序首先在pubsub_channels字典中为频道创建一个键,将值设置为空列表,然后将客户端添加到列表中。成为链表的第一个元素。php发布订阅演示//publish.phpconnect('127.0.0.1',6379);//频道名称$channel='cctv.5';$message='中国男篮战胜美国男篮夺得奥运会冠军';$Redis->publish($channel,$message);?>//subscribe.phpconnect('127.0.0.1',6379);$channel=['cctv.5'];//订阅多个频道,直接添加数组子元素$Redis->subscribe($channel,function($instance,$channel,$message){//除了4个命令SUBSCRIBE,PSUBSCRIBE,UNSUBSCRIBE,PUNSUBSCRIBE,other命令不能在这里使用var_dump($instance,$channel,$message);});?>注意我们接收消息的回调函数。除了SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE、PUNSUBSCRIBE这四个命令外,其他命令都不能使用。如果您使用的是CLI(命令行界面),则此处存在错误,您可能无法取消订阅消息。取消订阅只能通过组合键Ctrl+c来终止。取消订阅频道使用UNSUBSCRIBE命令取消订阅一个或多个频道。服务端会从pubsub_channels中移除客户端与未订阅频道的关联:程序会根据未订阅频道的名称在pubsub_channels字典中找到该频道对应的订阅者列表,然后将未订阅的客户端从订阅者列表中删除终端信息。如果删除客户端后,该频道的订阅者列表变为空列表,则表示该频道没有订阅者,程序会从pubsub_channels字典中删除该频道对应的key。订阅模式服务器将所有订阅关系保存在服务器状态的pubsub_channels属性中,在模式订阅中,服务器也将所有模式的订阅关系保存在服务器状态的pubsub_patterns属性中。structredisServer{//...//保存所有模式订阅关系列表*pubsub_patterns;//...}pubsub_patterns属性是一个链表,链表中的每个节点都包含一个pubsubPattern结构,这个结构的pattern属性记录指定的订阅模式,client属性记录订阅模式的客户端.typedefstructpubsubPattern{//订阅模式客户端redisClient*client;//订阅模式robj*pattern;}pubsubPattern;每当客户端执行PSUBSCRIBE命令订阅一种或几种模式时,服务端会对订阅的模式执行以下两个操作:创建一个新的pubsubPattern结构,将结构的pattern属性设置为订阅的模式(例如:music.*),并将客户端属性设置为订阅模式的客户端。将pubsubPattern结构添加到pubsub_patterns列表的末尾。取消订阅模式取消订阅命令PUNSUBSCRIBE是PSUBSCRIBE命令的逆命令。当客户端取消订阅某个模式或模式时,服务器会在pubsub_patterns列表中查找并删除pattern属性为取消订阅模式且客户端属性为执行取消订阅命令的客户端的pubsubPattern结构。当redis客户端执行PUBLISH
