redis 事务

Redis 事务

redis 事务是一组指令的集合。java

redis 事务主要由multi, exec, discard, watch 命令组成。事务容许一组操做命令,一键执行;redis事务执行有两个重要保证。web

  1. 事务中全部的命令都被序列化而后顺序执行。若是另一个客户端发起一个请求,也不会穿插到redis事务执行命令中。redis事务是被独立被执行的。redis

  2. redis事务保证全部的命令要么都执行,要么都不执行,因此说redis事务是原子操做。Exec命令就是触发了事务去执行;当一个客户端开启事务后,exec命令执行前就与服务器断开链接,任何操做都不会执行,redis服务器会清空消息队列,相反断开前执行了exec命令,全部的操做都会执行。 当开启AOF 日志备份时,redis会调用系统write操做将事务写到硬盘上, 然而若是redis服务器崩溃,或者被系统管理员强制终止了,redis颇有可能只有一部分操做被写到硬盘。redis 拒绝以这种方式启动,将会以报错的方式退出; 经过使用AOF检测工做能够定位到AOF文件,并将部分事务操做删除,就能够正常启动.数据库

使用

multi命令是进入reids 事务的为惟一方式。 执行multi命令的返回值老是”OK”.
当进入redis事务,用户能够发布多条redis命令,redis服务器收到这些命令,不会当即执行它们,而是将它们排队.全部的缓存排队的命令都是经过调用exec 命令一次性执行的。缓存

调用discard 能够将客户端事务清空,而且退出事务。服务器

Exec 将返回一组应答,每个应答对应事务中一个请求结果。svg

当redis一个链接中开启了事务请求,全部的指令将会以QUEUED 状态字符返回。排队的指令在调用exec命令后才安排执行.日志

总结:

1.multi :开启redis 事务xml

2.exec : 提交事务请求,并退出事务队列

3.discard: 取消事务中的命名请求,并退出事务。

事务中错误

在redis 事务中,有可能引起两种错误:

1. 在执行exec命令以前的错误,命令缓存失败。例如:语法错误,未知命令,错误数值,或者边界过界,内存溢出等。

2. 调用exec后,redis服务器执行指令的错误,例如使用错误的值进行操做。

redis客户端只能检测出第一种错误,发生在exec命令以前的错误, 经过检测返回的指令,正常返回“QUEUED”,其余返回的都是错误。发生错误后,redis自动丢弃事务中的名了,但不会退出事务;在exec以前的任何命令都将丢弃。

对于第二种错误,是redis服务器运行错误,事务中有一个命令执行错误,不会影响其余命令的执行。

redis 事务中没有回滚

若是你使用过关系型数据库,看到redis 开启一个事务中,发生错误后,不会回滚数据,会感到奇怪; 正由于这样redis保持内部的简介和快速。

watch 命令

watch 命令在事务中提供了一种CAS行为。watch 能够监听多个键,一旦其中一个键被修改或者删除,以后的事务都将不会执行。监控持续到exec的执行。它能够用在具备竞争的环境下; 例如:两个客户端都试图修改一个键的值10, 都试图自增到11,最后提交后的结果就是11q,而不是12,因此watch命令能够很好的处理这种问题。

当开启watch后,有另外更改了监听的键,自身开启的事务修改就会失败,咱们能够监听到返回结果,而后重复操做,直到成功。就像java中的乐观锁,也是基于CAS机制。

参考文献:http://redis.io/topics/transactions