面试题答案
一键面试- WATCH命令的基本原理:
- 监控数据:在执行事务之前,使用
WATCH key [key ...]
命令可以监控一个或多个键。例如WATCH user:1:balance
,这表示开始监控user:1:balance
这个键。 - 数据变化检测:Redis会在事务执行前,记录被监控键的当前值。在事务执行过程中,如果被监控的键的值发生了变化(无论是通过其他客户端的命令修改,还是当前客户端在监控后但在事务执行前修改),Redis会检测到这种变化。
- 监控数据:在执行事务之前,使用
- 事务执行逻辑:
- 正常执行:当事务中的所有命令准备好执行时(通过
MULTI
开启事务,EXEC
执行事务),如果在监控期间被监控的键没有发生变化,Redis会正常执行事务中的所有命令,就像一个原子操作一样,确保数据的一致性。例如,事务中有对user:1:balance
进行加减操作的命令,在没有其他并发修改的情况下,这些操作会依次执行,不会出现数据错误。 - 失败处理:如果在监控期间,任何一个被监控的键的值发生了变化,当执行
EXEC
时,事务会失败并返回nil
,表示事务没有执行成功。客户端可以捕获这个返回值,然后根据业务逻辑决定是否重新监控并执行事务。比如,一个电商应用中,监控商品库存键,在事务中进行库存减少操作,如果在监控到执行事务期间,库存被其他用户买走(库存键值变化),事务就失败,客户端可以重新获取库存并尝试再次购买。
- 正常执行:当事务中的所有命令准备好执行时(通过
- 实现乐观锁机制:
- 乐观假设:乐观锁机制基于一种乐观的假设,即大多数情况下,并发操作不会发生冲突。WATCH命令正是基于这种假设,在事务执行前只监控数据,而不是像悲观锁那样一开始就锁定数据。
- 并发控制:在高并发场景下,多个客户端可能同时监控同一个键并尝试执行事务。只有在没有并发修改的情况下,事务才能成功执行。如果有并发修改,事务失败,客户端需要重新尝试。这就保证了即使在并发环境下,对数据的操作也是安全的,避免了数据错误,例如多个客户端同时对账户余额进行错误的加减操作导致余额数据错乱。