redis 事务介绍

事务

multi - exec ;中间的命令会依次执行。

multi
sadd "user:1:following" 2
sadd "user:2:followiers" 1
exec

异常处理

1、语法错误.下面命令只有第一个是正确的,其余两个是错误的,编译不通过,整个事务都不会执行

multi
set key value
set key
(error)
errorCommand key
(error)
exec

2、运行错误;执行之前redis无法发现错误,运行时错误。下面的例子中,sadd key 2 是一个错误的命令,但只有执行的时候才会报错,但是不会影响事务继续进行。所有set key 3也会执行。最后的结果是3

multi
set key 1
sadd key 2
(error)
set key 3
exec
get key
(3)

watch 命令

情景介绍:事务中每个命令执行结果都是最后一起返回的,所以无法将前一个命令的结果作为下一条命令的参数。 为了解决这个问题,我们可以在get键值后保证该键值不被其他客户端修改,知道函数执行完成后才允许其他客户端修改该键值,这样可以防止竞太条件。watch命令可以监控一个或者多个键。一旦其中有一个键被修改,之后的事务就不会执行。监控一直持续到exec命令

set key 1
watch key
set key 2
multi
set key 3
exec
get key
(2)

可以使用watch 来通过事务实现incr函数。伪代码:

def incr($key)
    watch $key
    $value = get $key
    if not $value
        $value = 0
    $value = $value+1
    MULTI
    set $key,$value
    result = exec
    return result[0]

watch 命令的作用只是当被监控的键值被修改后阻止之后一个事务的执行。而不能保证其他客户端不修改这一键值。

也可以使用 unwatch 命令来取消监控。比如:实现hsetxx函数,仅当字段存在时才赋值

def hsetxx($key,$field,$value)
    watch $key
    $isFieldExists = HEXISTS $key,$field
    if $isFieldExists is 1
        multi
        hset $key ,$field,$value
        exec
    else
        unwatch
    return $isFieldExists

猜你喜欢

转载自www.cnblogs.com/lliule/p/9648438.html
今日推荐