Redis的事务(部分支持)
2017-04-06 00:59
225 查看
假期过了,赶紧来更新一下东东,最近项目一直处于上线阶段,每天加班调试优化模块功能,导致好几天回到家已经是后半夜了。好了,言归正传。
关于Redis事务一些小小的总结
一说到事务,肯定想到的是像传统关系型数据库那样,要么全部成功,要么全部失败。事务的四大特性ACID信手拈来。但这里对不起了,Redis事务可跟关系型数据库不太一样了,因为它只是部分支持事务,下文会详细的说明。 是什么?可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其他事务插入,不许加塞 能干嘛?一个队列中,一次性,顺序性,排他性的执行一系列命令 怎么玩?开启事务使用MULTI,但不见得开启,redis会返回ok代表我收到了,所有命令使用EXEC调用,使用DISCARD放弃事务,表示不玩了
常用的命令有:
WATCH key(keys) 监视一个或多个key,如果在事务执行之前这个或这些key被其他命令所改动,那么事务将被打断
MULTI 标记一个事务块的开始
EXEC 执行所有事务块内的命令
DISCARD 取消事务,放弃执行事务块内的所有命令
UNWATCH 取消WATCH 命令对所有 key 的监控
1:正常执行 MULTI … EXEC
2:放弃事务 DISCARD
3:全体连坐 要么全部成功,要么全部失败,命令错误
4:冤头债主 命令正确,但执行失败报错
5:watch监控:
悲观锁/乐观锁/CAS(check and set)
悲观锁:锁整张表,性能极差,但一致性很高
乐观锁:为了即保证高并发,又保证不说整张表,在每条记录后面加一个version版本号
无加塞篡改,先监控在开启MULTI,保证两笔金额变动在同一个事务内
有加塞篡改,横刀夺爱,先watch key 修改value 别人改了 那么失败了。 如果我知道别人改了,我先unwatch 在watch 在multi 然后修改 在exec提交执行
三个阶段:
1. 开启:以MULTI开始一个事务
2. 入队:将多个命令入队到事务中,找到这些命令并不会立即执行,而是放到等待执行事务队列里面
3. 执行:由EXEC命令触发事务
三个特性:单独的隔离操作:事务的所有命令都会序列化、按顺序地实行
没有隔离级别的概念:事务提交前任何指令都不会被实际执行
不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,不回滚
相关文章推荐
- 深入理解Spring Redis的使用 (二)、RedisTemplate事务支持、序列化
- sharding-jdbc 事务支持部分观后感
- spring3.2+hibernate4 事务管理(支持自定义部分开发和关闭事务)
- acl 不支持redis 集群 事务操作
- 深入理解Spring Redis的使用 (二)、RedisTemplate事务支持、序列化
- 深入理解Spring Redis的使用 (二)、RedisTemplate事务支持、序列化
- Redis笔记(四):Redis事务支持
- 深入理解Spring Redis的使用 (二)、RedisTemplate事务支持、序列化
- Redis事务为什么不支持回滚
- 支持语音的 XML,第 3 部分: 开发语音 blog 应用程序
- Redis事务介绍
- 关于 IE firefox Chrome下的通过用js 关闭窗口部分不支持问题解决
- elasticsearch 搜索不支持单词的部分进行匹配
- spring 对事务的支持
- 遇过的坑(2)—MyISAM表类型不支持事务操作
- 在grails加入spring事务支持 转
- Redis教程(八):事务详解
- redis数据库事务处理及hash,list,set类型的python开发应用 推荐
- Hibernate4实战 之 第五部分:Hibernate的事务和并发
- Redis事务