Redis官方文档(11) ——发布订阅

[align=center][b]Redis3官方文档(11)
——发布订阅[/b][/align]

SUNSCRIBE,UNSUBSCRIBE和PUBLISH命令实现了发布/订阅范式,发送者(发布者)将它们的消息发送给特定的接收者(订阅者)(引用自维基百科)。更确切地说,,发布的消息进入频道(channel),而不需要知道订阅者的存在。订阅者只需要表达对一到多个频道的兴趣,并且只接收感兴趣的消息,不需要知道发布者的存在。这种发布者和订阅者的解耦可以带来更好的伸缩性和更加动态的网络拓扑。
例如,为了订阅频道foo和bar,客户端发送一个SUNBCRIBE命令及频道的名称:
SUBSCRIBE foo bar

其它客户端往这个频道发送的消息会被Redis推送到所有订阅的客户端。
订阅一到多个频道的客户端不应该发送命令,尽管其可以订阅和取消订阅其它频道。订阅和取消订阅操作的回复以消息的形式进行发送,所以客户端只能读取连续的消息流,第一个元素表明消息的类型。处于订阅状态中的客户端允许使用的命令是SUBSCIBE,PSUBSCRIBE,UNSUBSCRIBE,PUNSUBSCRIBE,PING和QUIT。

[b]推送消息的格式(Format of pushed messages)[/b]
消息是一个三个元素的数组回复(Array reply)。
第一个元素是消息的类型:
[list]
[*]subscribe:表明我们成功地订阅了频道,频道作为第二个元素。第三个参数代表我们当前订阅的频道数量。
[*]unsubscribe:表明我们成功地取消订阅了频道,频道作为第二个元素。第三个参数代表我们当前订阅的频道数量。当最后一个参数为零时,我们就没有订阅任何频道,客户端可以发送任何类型的Redis命令,因为我们已经不再处于发布/订阅状态。
[*]message:作为另一个客户端发送的PUBLISH命令的结果而收到的消息。第二个元素是原始频道的名称,第三个参数是真实的消息负荷(payload)。
[/list]

[b]数据库和作用域(Database & Scoping)[/b]
发布/订阅和键空间没有关系。在任何层次上都不干预,包括数据库编号。
在db 10上发布,也会被db 1上的订阅者收听到。
如果你需要某种形式的作用域,请使用环境的名称(test,staging,production)作为频道的参数。

[b]线路协议样例(Wire protocol example)[/b]
SUBSCRIBE first second
*3
$9
subscribe
$5
first
:1
*3
$9
subscribe
$6
second
:2

此时,我们从另一个客户端向名为sencond的频道发送了一个PUBLISH操作:
> PUBLISH second Hello

下面是第一个客户端收到的:
*3
$7
message
$6
second
$5
Hello

现在客户端使用不带额外参数的UNSUBSCRIBE命令从所有频道取消关注:
UNSUBSCRIBE
*3
$11
unsubscribe
$6
second
:1
*3
$11
unsubscribe
$5
first
:0

[b]模式匹配订阅(Pattern-matching subscriptions)[/b]
Redis的发布/订阅实现支持模式匹配。客户端可以订阅通配符模式(glob-style patterns)来接收发送给所有名字匹配的频道的消息。
例如:
PSUBSCRIBE news.*

会收到发送给频道news.art.figurative,news.music.jazz等的全部消息。所有通配符模式都是合法的,所以多个通配符(wildcard)是支持的。
PUNSUBSCRIBE news.*

会从这些模式取消订阅。其他订阅不会收这个调用的影响。
作为模式匹配的结果而收到的消息以不同的格式被发送:
[list]
[*]消息类型是pmessage:这是由于另一个客户端发送PUBLISH命令并符合模式匹配的订阅的结果而接收到的消息。第二个元素是匹配到的原始模式,第三个元素是原始频道的名称,最后一个元素是真实的消息负荷。
[/list]
类似于SUBSCRIBE和UNSUBSCRIBE,PSUBSCRIBE和PUNSUBSCRIBE命令也会被系统回复确认(acknowledged),使用和sunscribe和unsubscribe相同的格式发送psubscribe和punsubscribe类型的消息。

[b]消息同时匹配模式和频道订阅(Messages matching both a pattern and a channel subscription)[/b]
如果客户端订阅了多个与发布的消息相匹配的模式,或者如果客户端同时订阅了与发布的消息相匹配的模式和频道,客户端可能会多次收到同一条消息。向下面的例子:
SUBSCRIBE foo
PSUBSCRIBE f*

在上面的例子中,如果一条消息发送给了频道foo,客户端会收到两条消息:一条message类型的,一条pmessage类型的。

[b]模式匹配时订阅数含义(The meaning of the subscription count with pattern matching)[/b]
在subscribe,unsubscribe,psubscribe和punsubscribe消息类型中,最后一个参数是仍然活跃的订阅的计数。这个数字是客户端仍然在订阅的模式和频道的真实总数。所以,只有当这个计数由于从所有的频道和模式取消订阅而下降到零,客户端将退出 发布/订阅状态。

[b]编程样例(Programming example)[/b]
Pieter Noordhuis提供了一个很好的样例,使用EventMachine和Redis创建了一个多人高性能的网页聊天(https://gist.github.com/pietern/348262 译者注)。

[b]客户端库实现小贴士(Client library implementation hints)[/b]
由于收到的所有消息都包含引起消息传递的原始订阅(message类型时的频道,pmessage类型时的原始模式),客户端库可以使用哈希表将原始订阅绑定到回调(可以是匿名函数,代码块,函数指针)。
当收到一条消息时,可以在O(1)复杂度内完成查找,来将消息传递给注册的回调。
===============================================================================
大家好,我是阮威。华中科技大学,计算机软件专业硕士。毕业后加入腾讯,先后在腾讯电子商务部和无线游戏产品部工作,现供职于欢聚时代基础产品部。IT男,至今。欢迎大家收听我的公众账号。
[img]http://dl.iteye.com/upload/picture/pic/131535/0413e8f1-7352-3d0e-b9c8-9c5f36bd6bd0.png[/img]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值