Skip to content

Commit 29b7417

Browse files
committed
[docs update]Redis WATCH 命令介绍完善
1 parent 8303a8d commit 29b7417

File tree

1 file changed

+66
-13
lines changed

1 file changed

+66
-13
lines changed

docs/database/redis/redis-questions-02.md

Lines changed: 66 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,48 +21,101 @@ Redis 可以通过 **`MULTI`,`EXEC`,`DISCARD` 和 `WATCH`** 等命令来实
2121
```bash
2222
> MULTI
2323
OK
24-
> SET USER "Guide哥"
24+
> SET PROJECT "JavaGuide"
2525
QUEUED
26-
> GET USER
26+
> GET PROJECT
2727
QUEUED
2828
> EXEC
2929
1) OK
30-
2) "Guide哥"
30+
2) "JavaGuide"
3131
```
3232

33-
使用 [`MULTI`](https://redis.io/commands/multi) 命令后可以输入多个命令Redis 不会立即执行这些命令,而是将它们放到队列,当调用了 [`EXEC`](https://redis.io/commands/exec) 命令将执行所有命令
33+
[`MULTI`](https://redis.io/commands/multi) 命令后可以输入多个命令Redis 不会立即执行这些命令,而是将它们放到队列,当调用了 [`EXEC`](https://redis.io/commands/exec) 命令后,再执行所有的命令
3434

3535
这个过程是这样的:
3636

37-
1. 开始事务(`MULTI`
38-
2. 命令入队(批量操作 Redis 的命令,先进先出(FIFO)的顺序执行)
37+
1. 开始事务(`MULTI`
38+
2. 命令入队(批量操作 Redis 的命令,先进先出(FIFO)的顺序执行)
3939
3. 执行事务(`EXEC`)。
4040

4141
你也可以通过 [`DISCARD`](https://redis.io/commands/discard) 命令取消一个事务,它会清空事务队列中保存的所有命令。
4242

4343
```bash
4444
> MULTI
4545
OK
46-
> SET USER "Guide哥"
46+
> SET PROJECT "JavaGuide"
4747
QUEUED
48-
> GET USER
48+
> GET PROJECT
4949
QUEUED
5050
> DISCARD
5151
OK
5252
```
5353

54-
[`WATCH`](https://redis.io/commands/watch) 命令用于监听指定的键,当调用 `EXEC` 命令执行事务时,如果一个被 `WATCH` 命令监视的键被修改的话,整个事务都不会执行,直接返回失败。
54+
你可以通过[`WATCH`](https://redis.io/commands/watch) 命令监听指定的 Key,当调用 `EXEC` 命令执行事务时,如果一个被 `WATCH` 命令监视的 Key 被 **其他客户端/Session** 修改的话,整个事务都不会被执行。
55+
56+
```bash
57+
# 客户端 1
58+
> SET PROJECT "RustGuide"
59+
OK
60+
> WATCH PROJECT
61+
OK
62+
> MULTI
63+
OK
64+
> SET PROJECT "JavaGuide"
65+
QUEUED
66+
67+
# 客户端 2
68+
# 在客户端 1 执行 EXEC 命令提交事务之前修改 PROJECT 的值
69+
> SET PROJECT "GoGuide"
70+
71+
# 客户端 1
72+
# 修改失败,因为 PROJECT 的值被客户端2修改了
73+
> EXEC
74+
(nil)
75+
> GET PROJECT
76+
"GoGuide"
77+
```
78+
79+
不过,如果 **WATCH****事务** 在同一个 Session 里,并且被 **WATCH** 监视的 Key 被修改的操作发生在事务内部,这个事务是可以被执行成功的(相关 issue :[WATCH 命令碰到 MULTI 命令时的不同效果](https://github.com/Snailclimb/JavaGuide/issues/1714))。
80+
81+
事务内部修改 WATCH 监视的 Key:
5582

5683
```bash
57-
> WATCH USER
84+
> SET PROJECT "JavaGuide"
85+
OK
86+
> WATCH PROJECT
87+
OK
88+
> MULTI
89+
OK
90+
> SET PROJECT "JavaGuide1"
91+
QUEUED
92+
> SET PROJECT "JavaGuide2"
93+
QUEUED
94+
> SET PROJECT "JavaGuide3"
95+
QUEUED
96+
> EXEC
97+
1) OK
98+
2) OK
99+
3) OK
100+
127.0.0.1:6379> GET PROJECT
101+
"JavaGuide3"
102+
```
103+
104+
事务外部修改 WATCH 监视的 Key:
105+
106+
```bash
107+
> SET PROJECT "JavaGuide"
108+
OK
109+
> WATCH PROJECT
110+
OK
111+
> SET PROJECT "JavaGuide2"
58112
OK
59113
> MULTI
60-
> SET USER "Guide哥"
61114
OK
62115
> GET USER
63-
Guide哥
116+
QUEUED
64117
> EXEC
65-
ERR EXEC without MULTI
118+
(nil)
66119
```
67120

68121
Redis 官网相关介绍 [https://redis.io/topics/transactions](https://redis.io/topics/transactions) 如下:

0 commit comments

Comments
 (0)