事务的实现
- Redis的事务是将多个命令打包,一次性、顺序性地执行多个命令。
MULTI
指令标记事务的开始,将执行该命令的客户端从非事务切换至事务状态。
- 在事务状态下,如果客户端发送了
EXEC
、DISCARD
、WATCH
、MULTI
四个命令中的一个,服务器会立即执行这个命令;如果是其它命令,不会立即执行,而是将命令放入一个事务队列中,向客户端回复QUEUED
。
- 事务队列以先进先出的方式保存入队的命令,当客户端发送
EXEC
指令时顺序执行队列中的所有命令。
EXEC
指令执行事务队列中的命令,DISCARD
用于放弃当前事务。
- Redis没有回滚机制,因此不具备原子性。
WATCH命令
WATCH
命令是一个乐观锁,用于在EXEC
执行之前,监视指定的任意数量的键,若被监视的键中有至少一个被修改,则拒绝执行事务;UNWATCH
命令用于取消对所有键的监视。
- 被
WATCH
的键保存在一个叫watched_keys
的字典中,执行修改指令之前会先判断键是否存在这个字典的键空间中,如果存在,则将被修改键的客户端的REDIS_DIRTY_CAS
标识打开,表示客户端的事务安全性被破坏,该客户端发送EXEC
命令时,如果REDIS_DIRTY_CAS
标识已经打开,服务器会拒绝执行该客户端提交的事务。