PUNSUBSCRIBE:退订模式

与退订频道的UNSUBSCRIBE命令类似,Redis也提供了用于退订模式的 PUNSUBSCRIBE命令:

PUNSUBSCRIBE [pattern pattern pattern ...]

这个命令允许用户输入任意多个想要退订的模式,如果用户没有给定 任何模式,那么命令将退订当前客户端已订阅的所有模式。

举个例子,如果我们想要退订"news.*"模式,那么可以执行以下命令

PUNSUBSCRIBE "news.*"

又或者说,如果我们想要退订客户端目前已订阅的所有模式,那么可 以不给定任何参数直接调用PUNSUBSCRIBE命令:

PUNSUBSCRIBE

PUNSUBSCRIBE命令每次退订一个模式之后,都会向客户端返回一条退 订消息,该消息由3个元素组成:

·第1个元素是"punsubscribe",用于表明该消息是一条由 PUNSUBSCRIBE命令引起的退订消息。 ·第2个元素是被退订的模式。 ·第3个元素是客户端在执行当前这个退订操作之后,仍在订阅的模式数量。

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

与UNSUBSCRIBE命令一样,各个客户端对于PUNSUBSCRIBE命令的需求也 是不同的,有些客户端需要用到PUNSUBSCRIBE命令,而有些客户端则 不需要。

举个例子,Redis自带的命令行客户端redis-cli在执行PSUBSCRIBE命 令之后就会进入阻塞状态,只能通过同时按下Ctrl键和C键来退出程 序,因此它并不需要用到PUNSUBSCRIBE命令:

redis> PSUBSCRIBE "news.*"
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news.*"
3) (integer) 1
^C
$

如果我们使用的是redis-py客户端,那么就可以通过客户端提供的超 时特性,在执行PSUBSCRIBE命令之后继续保持非阻塞状态,并在有需 要时退订不想要的模式:

>>> from redis import Redis
>>> # 创建客户端对象和pubsub对象
>>> client = Redis(decode_responses=True)
>>> pubsub = client.pubsub()
>>> # 订阅模式
>>> pubsub.psubscribe("news.*")
>>> # 获取订阅消息
>>> pubsub.get_message(timeout=5)
{'type': 'psubscribe', 'pattern': None, 'channel': b'news.*', 'data': 1}
>>> # 尝试获取消息,并在阻塞5s之后自动返回
>>> pubsub.get_message(timeout=5)
>>>
>>> # 退订模式
>>> pubsub.punsubscribe("news.*")

其他信息

  • 复杂度:O(N*M),其中N为用户给定的模式数量,而M则是服务器目前被订阅的模式总数量。

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