事务
基本用法
Redis事务在形式上,指令分别是multi、exec、discard。multi指示事务的开始,exec指示事务的执行,discard指示事务的丢弃
multi
incr books
exec
所有的指令在exec之前不执行,而是缓存在服务器的一个事务队列中,服务器一旦收到exec指令,才开始执行整个事务队列,执行完毕后一次性返回所有指令的运行结果。因为Redis的单线程特性,它不用担心自己在执行队列的时候被其他指令打搅
原子性
事务执行到中间时遇到失败,后面的指令还会继续执行。Redis的事务根本不具备原子性,而仅仅满足了事务的隔离性中的串行化,当前执行的事务不被其他事务打断的权利
discard(丢弃)
multi
incr books
discard
在discard之后,队列中的所有指令多没有执行,就好像multi和discard中间的所有指令从未发生过一样
优化
Redis事务在发送每个指令到事务缓冲队列时都要经过一次网络读写,当一个事务内部的指令较多时,需要的网络IO时间也会线性增长,所以Redis的客户端再执行事务时都会结合pipeline一起使用
watch
watch会在事务开始之前盯住一个或多个关键变量,当事务执行时,也就是服务收到exec指令要顺序执行缓存的事务队列时,Redis会检查关键变量自watch之后是否被修改。如果关键变量被人改动了,exec指令就会返回NULL回复告知客户端事务执行失败,这个时候客户端一般会选择重试
watch books
incr books
multi
incr books
exec