*Redis PUNSUBSCRIBE 命令

退订所有符合给定模式的频道(Pattern Unsubscribe)。


*语法

PUNSUBSCRIBE [pattern [pattern ...]]

*参数说明

参数 类型 必填 说明
pattern String 要退订的频道匹配模式;不提供则退订所有模式订阅

*返回值

条件 返回值
退订成功 数组 ["punsubscribe", pattern, remaining_subscriptions]
无匹配订阅 仍会返回消息,remaining_subscriptions 为当前剩余订阅数

*时间复杂度

O(N + M),N 为匹配的 pattern 数量,M 为已订阅的 pattern 总数


*示例

*退订指定模式

> PUNSUBSCRIBE news:*
1) "punsubscribe"
2) "news:*"
3) (integer) 1

*退订多个模式

> PUNSUBSCRIBE news:* weather:*
1) "punsubscribe"
2) "news:*"
3) (integer) 2
1) "punsubscribe"
2) "weather:*"
3) (integer) 1

*退订所有模式订阅

> PUNSUBSCRIBE
1) "punsubscribe"
2) (nil)
3) (integer) 0

*常见错误

错误 原因 解决
在事务中执行 PUNSUBSCRIBE 不能在 MULTI/EXEC 中使用 在事务外执行
连接未处于 pub/sub 模式 退订本身可在任意状态执行 无实际效果,remaining 为 0

*最佳实践

  • 场景:客户端退出时清理模式订阅,释放服务器资源
  • 建议:客户端断开连接时 Redis 会自动清理订阅,但显式 PUNSUBSCRIBE 更优雅
  • 配合 PSUBSCRIBE 使用:先模式订阅,业务结束后模式退订
  • 无参数调用 PUNSUBSCRIBE 可一次性清除所有模式订阅

*FAQ

Q1: PUNSUBSCRIBE 和 UNSUBSCRIBE 有什么区别? A: PUNSUBSCRIBE 用于退订通过 PSUBSCRIBE 建立的模式订阅(支持通配符);UNSUBSCRIBE 用于退订通过 SUBSCRIBE 建立的精确频道订阅。两者退订的对象类型不同。

Q2: 退订不存在的模式会怎样? A: 不会报错,Redis 会返回退订消息,其中 remaining_subscriptions 显示当前剩余的模式订阅数量。

Q3: 客户端断开后订阅会自动清除吗? A: 是的。客户端断开 TCP 连接后,Redis 会自动清理该客户端的所有订阅(包括 SUBSCRIBEPSUBSCRIBE)。显式调用 PUNSUBSCRIBE 可在保持连接的情况下释放订阅。