*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 会自动清理该客户端的所有订阅(包括 SUBSCRIBE 和 PSUBSCRIBE)。显式调用 PUNSUBSCRIBE 可在保持连接的情况下释放订阅。