0

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)

既然都看到这里了,期望在下面看到你的见解.

Stephanie 227
6月26日提问
1 个回答
0

WATCH命令可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行,监控一直持续到EXEC,
其实就像一个乐观锁
ps:你想问的问题是啥…………

撰写答案

推广链接