23-按照规则订阅
4.4.5 按照规则订阅
除了可以使用 SUBSCRIBE 命令订阅指定名称的频道外,还可以使用 PSUBSCRIBE 命令订阅指定的规则。规则支持glob风格通配符格式(见3.1节),下面我们新打开一个redis-cli实例C进行演示:
redis C> PSUBSCRIBE channel.?* Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "channel.?*"
3) (integer) 1
规则channel.?*可以匹配channel.1和channel.10,但不会匹配channel.。这时在实例B中发布消息:
redis B> PUBLISH channel.1 hi! (integer) 2
返回结果为2是因为实例 A 和实例 C 两个客户端都订阅了 channel.1 频道。实例 C 接收到的回复是:
1) "pmessage"
2) "channel.?*"
3) "channel.1"
4) "hi!"
第一个值表示这条消息是通过 PSUBSCRIBE 命令订阅频道而收到的,第二个值表示订阅时使用的通配符,第三个值表示实际收到消息的频道命令,第四个值则是消息内容。
提示
使用
PSUBSCRIBE命令可以重复订阅一个频道,如某客户端执行了PSUBSCRIBE channel.? channel.?*,这时向channel.2发布消息后该客户端会收到两条消息,而同时PUBLISH命令返回的值也是2而不是1。同样的,如果有另一个客户端执行了SUBSCRIBE channel.10和PSUBSCRIBE channel.?*的话,向channel.10发送命令该客户端也会收到两条消息(但是是两种类型:message和pmessage),同时PUBLISH命令会返回2。
PUNSUBSCRIBE 命令可以退订指定的规则,用法是 PUNSUBSCRIBE [pattern [pattern …]] ,如果没有参数则会退订所有规则。
注意
使用
PUNSUBSCRIBE命令只能退订通过PSUBSCRIBE命令订阅的规则,不会影响直接通过SUBSCRIBE命令订阅的频道;同样UNSUBSCRIBE命令也不会影响通过PSUBSCRIBE命令订阅的规则。另外容易出错的一点是使用PUNSUBSCRIBE命令退订某个规则时不会将其中的通配符展开,而是进行严格的字符串匹配,所以PUNSUBSCRIBE *无法退订channel.*规则,而是必须使用PUNSUBSCRIBE channel.*才能退订。