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安装问题小结
- 使用 Redis 和 Python 构建一个共享单车的应用程序
- Redis偶发连接失败案例实战记录
- Redis中实现查找某个值的范围
- win 7 安装redis服务【笔记】
- redis的hGetAll函数的性能问题(记Redis那坑人的HGETALL)
- Redis和Memcached的区别详解
- 分割超大Redis数据库例子
- Redis总结笔记(一):安装和常用命令
- Redis sort 排序命令详解
- 用Redis实现微博关注关系
- Redis实现信息已读未读状态提示
- redis中修改配置文件中的端口号 密码方法
- 在Ruby on Rails上使用Redis Store的方法
- Redis和Memcache的区别总结
- 在Node.js应用中使用Redis的方法简介
- Redis服务器的启动过程分析
- web 应用中常用的各种 cache详解
- 利用yum安装Redis的方法详解
- 从MySQL到Redis的简单数据库迁移方法