*Redis UNWATCH 命令

取消 WATCH 命令对所有 key 的监视。


*语法

UNWATCH

*返回值

条件 返回值
总是 OK

*时间复杂度

O(1)

*

*示例

> WATCH balance:1001
OK
> UNWATCH
OK

# 之后 MULTI/EXEC 不再检查 balance:1001 是否被修改

*常见错误

错误 原因 解决
没有 WATCH 就 UNWATCH 无监视对象可取消 确认之前已执行 WATCH
在 MULTI 中调用 UNWATCH MULTI 开启后不能执行 在 MULTI 之前执行 UNWATCH 或改用 DISCARD
误认为 UNWATCH 会回滚事务 理解命令语义不清 明确 UNWATCH 仅取消监视,不取消命令队列

*最佳实践

  1. 取消监视:业务逻辑决定不需要乐观锁时,UNWATCH 释放监视,避免不必要的冲突检测。
  2. EXEC/DISCARD 自动取消:通常不需要手动调用 UNWATCH,EXECDISCARD 会自动取消所有 WATCH

  3. 事务失败后处理EXEC 返回 nil 表示事务失败,此时应重新 WATCH 并执行业务逻辑重试。

  4. 避免频繁 UNWATCHWATCH 后应尽快进入 MULTI/EXEC,减少中间执行其他命令的时间窗口。

*5. 连接池注意:从连接池获取的连接可能残留 WATCH 状态,使用前应执行 UNWATCH 或 DISCARD 清理。

*FAQ

Q1: UNWATCH 后还能重新 WATCH 吗? A: 可以。UNWATCH 取消当前所有监视,之后可以重新 WATCH 其他 key。

Q2: 连接断开会自动 UNWATCH 吗? A: 是。连接断开时所有 WATCH 自动取消。

Q3: UNWATCH 和 DISCARD 有什么区别? A: UNWATCH 仅取消 WATCH 监视,不取消已入队的命令;DISCARD 取消 MULTI 状态并清空命令队列,同时取消 WATCH

Q4: UNWATCH 后之前入队的命令还在吗? A: 如果已执行 MULTI,入队的命令仍然在队列中;UNWATCH 不影响命令队列。

Q5: 为什么推荐用 EXEC/DISCARD 代替手动 UNWATCH? A: 因为容易遗漏,EXECDISCARD 会自动处理 WATCH 清理,更不容易出错。