redis中的事务(版本2.6.16)
一.命令支持
1.multi
开始事务
2.exec
事务提交
3.取消事务
discard
二.事务示例
1.示例
redis>set key1 20
OK
redis>mutil
OK
redis>get key1
QUEUED
redis>incr key1
QUEUED
redis>exec
1)"20"
2)(integer)"21"
2.redis中的事务算是非常简单的,它将一组命令放入队列;即便要取值,也会将该命令放入队列.等到exec时候,再用for循环,将命令全部写入,如果其中一条命令执行错误,则放弃全部命令的写入.
三.并发控制(乐观锁)
设想一个场景,client1拿到了key1后,做了一系列其他操作,在此期间client2对key1加1;client1最后也对key1加1;理论上应该是key1加2,但实际上key1只是加了1;这就是并发产生的问题,redis提供了基于watch命令的乐观锁来防止这一问题产生.
1.基本命令
a.watch key1 ... keyN
监控某个key
b.unwatch
取消监控
*watch必须和mutil...exec配合使用,单独使用并不起作用.watch监控一个key,之后mutil...exec执行一组语句,如果在此期间,有另一个client更改了watch监控的key对应的值,则exec执行返回nil,整组命令不会提交.
2.示例
A.client1
a.redis>watch key1
b.redis>multi
c.redis>incr key1
d.redis>exec
B.client2
在client1执行到c这一步时,client2也执行incr key1;client1执行exec时,发现watch的key1有改变,则放弃整个事务写入,返回nil