面试题答案
一键面试Redis WATCH命令在并发控制方面的工作原理
- 监控机制:
WATCH
命令用于监控一个或多个键。当执行WATCH
命令后,Redis会在事务开始前,跟踪被监控键的变化情况。 - 事务执行:当开启一个事务(使用
MULTI
命令)后,Redis会将事务中的命令缓存起来,并不会立即执行。直到执行EXEC
命令时,Redis会检查在WATCH
之后,被监控的键是否被其他客户端修改过。 - 并发处理:如果被监控的键没有被修改,那么事务正常执行,所有缓存的命令会被原子性地执行。如果有任何一个被监控的键被修改了,那么事务会被取消,
EXEC
命令返回nil
,表示事务执行失败,客户端需要重新执行整个事务流程。
保证数据一致性的机制
- 乐观锁机制:
WATCH
命令基于乐观锁机制。它假设在大多数情况下,数据在被监控期间不会被其他客户端修改。只有在事务实际执行时,才检查数据是否真的被修改。 - 版本号概念:虽然Redis没有真正的版本号,但可以理解为每个键值对都有一个隐式的“版本”。每次键被修改,这个“版本”就会改变。
WATCH
通过监控这个隐式版本的变化来判断数据是否被修改,从而保证数据一致性。
执行WATCH后对被监控键执行非事务命令的影响
- 立即生效:对被监控的键执行其他非事务命令,这些命令会立即执行并修改键的值。
- 事务影响:如果在执行
WATCH
后,对被监控的键执行了非事务命令,那么当后续执行EXEC
时,事务会因为键已被修改而失败。这是因为WATCH
监控到了键值的变化,违反了乐观锁假设,事务无法保证原子性和一致性,所以被取消。