一.命令支持

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

05-11 16:03