Redis学习笔记(6)——事务

事务的实现

  • Redis的事务是将多个命令打包,一次性、顺序性地执行多个命令。
  • MULTI指令标记事务的开始,将执行该命令的客户端从非事务切换至事务状态。
  • 在事务状态下,如果客户端发送了EXECDISCARDWATCHMULTI四个命令中的一个,服务器会立即执行这个命令;如果是其它命令,不会立即执行,而是将命令放入一个事务队列中,向客户端回复QUEUED
  • 事务队列以先进先出的方式保存入队的命令,当客户端发送EXEC指令时顺序执行队列中的所有命令。
  • EXEC指令执行事务队列中的命令,DISCARD用于放弃当前事务。
  • Redis没有回滚机制,因此不具备原子性。

WATCH命令

  • WATCH命令是一个乐观锁,用于在EXEC执行之前,监视指定的任意数量的键,若被监视的键中有至少一个被修改,则拒绝执行事务;UNWATCH命令用于取消对所有键的监视。
  • WATCH的键保存在一个叫watched_keys的字典中,执行修改指令之前会先判断键是否存在这个字典的键空间中,如果存在,则将被修改键的客户端的REDIS_DIRTY_CAS标识打开,表示客户端的事务安全性被破坏,该客户端发送EXEC命令时,如果REDIS_DIRTY_CAS标识已经打开,服务器会拒绝执行该客户端提交的事务。