您的位置:首页 > 数据库 > Redis

redis 事务

2016-06-28 21:11 387 查看

Redis 事务

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

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

事务中所有的命令都被序列化然后顺序执行。如果另外一个客户端发起一个请求,也不会穿插到redis事务执行命令中。redis事务是被独立被执行的。

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

使用

multi命令是进入reids 事务的为唯一方式。 执行multi命令的返回值总是”OK”.

当进入redis事务,用户可以发布多条redis命令,redis服务器收到这些命令,不会立即执行它们,而是将它们排队.所有的缓存排队的命令都是通过调用exec 命令一次性执行的。

调用discard 可以将客户端事务清空,并且退出事务。

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

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

总结:

1.multi :开启redis 事务

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  redis