subscribe.unsubscribe和publish 三个命令实现了发布与订阅信息泛型,在这个实现中,发送者不是将消息发送给指定的接收者,而是将信息发送给频道,然后由频道将信息转发给所有对这个频道感兴趣的订阅者。
发送者无须知道任何关于订阅者的信息,而订阅者也不须知道是哪个客户端给它发送信息,它只要关注感兴趣的频道即可。
信息的格式
频道转发的每条信息都是一条带有三个元素的多条批复
信息的第一个元素标识了信息的类型:
subscribe:表示当前客户端成功地订阅了信息第二个元素所指示的频道。而信息的第三个则记录了目前客户端已订阅频道的总数。
unsubscribe:表示当前客户端成功地退订了信息第二个元素所指示的频道。信息的第三个元素记录了客户端目前仍在订阅的频道的数量。当客户端订阅的频道降为0时,客户端不订阅任何频道,它可以像往常一样,执行任何redis命令
message:表示这条信息是由某个客户端执行publish命令所发送的真正的信息。信息的第二个元素是信息来源的频道,而第三个元素时信息的内容
举个例子,如果客户端执行以下命令:
redis-> subscribe first second
那么它就会收到以下回复:
1):“subscribe”
2):“first”
3):(integer)1
1):“subscribe”
2):“second”
3):(integer)2
如果在这时,另外一个客户执行以下publish命令:
redis->publish second hello
那么之前的订阅了second频道的客户端将收到以下信息:
1) "mesage"
2) "second"
3) "hello"
当订阅者决定退订所有频道时,它可以执行一个无参数的unsubscribe命令:
redis->unsubscibe
订阅模式
redis 发布与订阅者支持模式匹配:客户端可以订阅一个带*号的模式,如果某个/某些频道的名字和这个模式匹配,那么当有信息发送给这个/这些频道的时候,客户端也会收到这个/这些频道的信息。
比如说,执行命令
pusubscribe news.*
的客户端将收到来自new.music.jazz,news.art等频道的信息,客户端订阅的模式里面可以包含多个glob风格的通配符,比如* . ? 等。