Redis事务
2017-11-29 11:18
169 查看
什么是Redis事务
Redis事务就是一次可以执行多个命令,本质是一系列命令的集合,一个事务中,所有命令都会序列化,按顺序地串行化执行而不会被其他命令插入,不许加塞。能做什么
一个队列中,一次性的,顺序的,排他性的执行一系列命令。怎么使用Redis事务
常用命令DISCARD //取消事务,放弃执行事务块内的所有命令 EXEC //执行事务块内的所有命令 MULTI //标记一个事务块的开始 UNWATCH //取消WATCH命令对所有key的监视 WATCH key [key....] //监视一个(或多个)key,如果事务执行之前,这个key被其他命令改动,那么将会打断该事务
正常执行
->MULTI ->set k1 v1 ->set k2 v2 ->set k3 v3 ->get k2 ->EXEC
放弃事务
当中途不想执行命令时,使用DISCARD命令,放弃事务执行。
->MULTI ->set k1 v1 ->set k2 v2 ->set k3 v3 ->get k2 ->DISCARD
全体连坐
当一条命令加入队列失败的时候,所有命令都无法正常执行。该事务无效。
冤头债主
当一条命令加入队列成功,但是执行失败的时候,只有错误执行的那条命令失败,其他的正常执行。
watch监控
1.乐观锁、悲观锁、CAS(check and set)
2.案例,信用卡余额和欠款
2.1无加塞更新余额和欠款
2.2有加塞更新余额和欠款
3.unwatch
4.执行exec后,watch加的监控锁就会取消
5.总结:watch指令,类似乐观锁,事务提交时,如果key的值已经被别的客户端改变,比如list已经被pop/push过了,整个事务队列就不会执行;如果whtch监控了多个key,如果在事务执行过程中有key被修改过,exec的时候会报错,整个事务执行失败。
Redis事务的三个阶段
开启:multi命令开启事务。入队:将多个命令加入到事务队列中,但是不会立即执行,等到exec命令时开始依次执行。
执行:由exec命令触发事务
Redis事务的三个特性
单独的隔离操作:事务中所有命令都会序列化,按顺序执行,事务在执行过程中,不会被其他客户端发来的命令请求打断。没有隔离级别的概念:队列中的所有命令没有提交之前都不会被执行,因为事务提交前,任何命令都不会被实际执行,也就不存在“事务内的查询要看到事务内的更新,在事务外不能看到”这种问题。
不保证原子性:Redis事务中,如果有一条命令执行失败(冤头债主),其他命令会继续执行,不存在回滚操作。