事务的实现
- 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标识已经打开,服务器会拒绝执行该客户端提交的事务。