*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 仅取消监视,不取消命令队列 |
*最佳实践
- 取消监视:业务逻辑决定不需要乐观锁时,UNWATCH 释放监视,避免不必要的冲突检测。
EXEC/DISCARD 自动取消:通常不需要手动调用 UNWATCH,EXEC 或 DISCARD 会自动取消所有 WATCH。
*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: 因为容易遗漏,EXEC 和 DISCARD 会自动处理 WATCH 清理,更不容易出错。