UNSUBSCRIBE:退订频道

用户在使用SUBSCRIBE命令订阅一个或多个频道之后,如果不想再收到 某个频道的消息,那么可以使用UNSUBSCRIBE命令退订指定的频道:

UNSUBSCRIBE [channel channel ...]

UNSUBSCRIBE命令允许用户给定任意多个频道。如果用户没有给定任何 频道,直接以无参数方式执行UNSUBSCRIBE命令,那么命令将退订当前 客户端已经订阅的所有频道。

举个例子,如果我们想要让客户端退订"news.it"频道和"news.sport"频道,那么可以执行以下命令:

UNSUBSCRIBE "news.it" "news.sport"

与此类似,如果我们想要让客户端退订目前已订阅的所有频道,那么 只需要以无参数方式直接执行UNSUBSCRIBE命令即可:

UNSUBSCRIBE

客户端在每次退订频道之后,都会收到服务器发来的退订消息,这条消息由3个元素组成:

·第1个元素是"unsubscribe",表明该消息是一条由退订操作产生的消息。 ·第2个元素是被退订频道的名字。 ·第3个元素是客户端在执行退订操作之后,目前仍在订阅的频道数量

UNSUBSCRIBE命令在不同客户端中的应用

虽然Redis提供了用于退订频道的UNSUBSCRIBE命令,但由于各个客户 端对于发布与订阅功能的支持方式不尽相同,所以并非所有客户端都 可以使用UNSUBSCRIBE命令执行退订操作。

比如,Redis自带的命令行客户端redis-cli在执行SUBSCRIBE命令之后 就会进入阻塞状态,无法再执行任何其他命令,用户只能通过同时按 下Ctrl键和C键强制退出redis-cli程序,所以这个客户端实际上并不 会用到UNSUBSCRIBE命令:

redis> SUBSCRIBE "news.it"
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news.it"
3) (integer) 1
^C --同时按下Ctrl键和C键
$ --已退出redis-cli

一些编程语言为发布与订阅提供了更好的支持,在这些语言的客户端 中,用户是可以使用UNSUBSCRIBE命令的。比如Python语言的Redis客 户端redis-py就允许用户在尝试获取消息的时候给定一个最大阻塞时 限,并在阻塞时限到达之后自动取消阻塞:

>>> from redis import Redis
>>> # 创建客户端对象和发布与订阅对象
>>> client = Redis(decode_responses=True)
>>> pubsub = client.pubsub()
>>> # 订阅"news.it"频道
>>> pubsub.subscribe("news.it")
>>> # 尝试获取消息,最大阻塞时限为5s
>>> pubsub.get_message(timeout=5)
{'pattern': None, 'type': 'subscribe', 'channel': 'news.sport', 'data': 1L}
>>> # 再次尝试获取消息,但是什么都没收到,函数在阻塞5s之后自动取消阻塞
>>> pubsub.get_message(timeout=5)
>>>

当我们以这种非阻塞方式使用发布与订阅功能时,就可以调用 UNSUBSCRIBE命令退订不想要的频道。比如以下代码就展示了退订 "news.it" 频道的方法:

>>> pubsub.unsubscribe("news.it")

在此之后,客户端将不会再接收到来自"news.it"频道的消息。

其他信息

  • 复杂度:O(N),其中N为服务器目前拥有的订阅者总数量。

  • 版本要求:UNSUBSCRIBE命令从Redis 2.0.0版本开始可用。