Redis Watch Command

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)

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

阅读 2.7k
1 个回答

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题