redis 中 关于 watch 命令的介绍:
WATCH key [key ...]
summary: Watch the given keys to determine execution of the MULTI/EXEC block
`观察给定的 keys 来决定 MULTI/EXEC 块是否执行`
since: 2.2.0
group: transactions
`自己的理解:在 MULTI/EXEC 块执行之前会判断
被 watch 的keys的值是否改变,如果都没改变则执行MULTI/EXEC 块`
下面的代码实现自增功能
def incr($key)
WATCH $key
`观察$key的值,如果没有改变就执行下面 MULTI/EXEC 块,来保证逻辑正确性`
$value = GET $key
if not $value
$value = 0
$value = $value + 1
MULTI
SET $key $value
result = EXEC
return result[0]
`在 MULT/EXEC块中无法获取某个KEY的返回值,此时可以通过WATCH来实现同样的效果`
如果代码写成这样会有什么后果?
def incr($key)
$value = GET $key
if not $value
$value = 0
$value = $value + 1
return SET $key $value
redis-cli中验证改变Watch key的值, MULTI/EXEC是否执行
127.0.0.1:6379> WATCH key1
OK
127.0.0.1:6379> SET key1 value1
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET key2 value2
QUEUED
127.0.0.1:6379> SET key3 value3
QUEUED
127.0.0.1:6379> EXEC
(nil)
127.0.0.1:6379> GET key2
(nil)
127.0.0.1:6379> GET key3
(nil)
既然都看到这里了,期望在下面看到你的见解.
WATCH命令可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行,监控一直持续到EXEC,
其实就像一个乐观锁
ps:你想问的问题是啥…………