Redis的事务

Redis的事务

每个事务的操作指令都有begin、commit、rollback。大致如下

begin();
try {
    comand1();
    ....
    commit();
} catch (Exception e) {
    rollback();
}

Redis的事务也是差不多,指令分别是multi、exec、discard。multi事务的开始,exec事务的执行,discard事务的丢弃。

> multi
ok
> incr books
QUEUED
> incr books
QUEUED
> exec
(integer) 1
(integer) 2

上面指令演示了一个完整的事务过程,所有的指令在exec之前不执行,而是缓存在服务器的一个事务队列中,服务器一旦受到exec指令,才开始执行整个事务队列,执行完毕后一次性返回所有指令的运行结果。因为Redis的单线程特性,它不用担心自己在执行队列的时候被其他指令打搅。可以保证他们得到原子性。

上面的Redis事务在发送每个指令到事务缓存队列时都要经过一次网络读写,当一个事务内部的指令过多的时候,需要的网络IO时间也会线性增长,所以通常Redis的客户端在执行事务都会结合pipeline一起使用,这样可以将多次IO操作压缩为单次IO操作

Redis的watch指令

Redis的watch机制是一个乐观锁,会在事务开始之前盯住一个或者多个关键变量,当事务执行时,也就是服务器收到exec指令要顺序执行缓存的事务队列时,redis会检查关键变量自watch之后是否被修改了(包括当前事务所在的客户端)。如果关键变量被人动过了,exec指令就会返回NULL告知客户端事务执行失败

标签:
作者:华传财
舞台上有你,就演好角色; 舞台上没你,就静静地做观众;

已有 0 位网友参与,快来吐槽:

发表评论