面试题答案
一键面试WATCH命令的作用
- 乐观锁机制实现:WATCH命令可以为Redis事务提供乐观锁机制。它允许用户在执行MULTI命令开启事务之前,监控一个或多个键。如果在WATCH之后,被监控的键被其他客户端修改,那么当前客户端的事务将被打断,不会执行EXEC命令,而是返回一个错误。这确保了在事务执行期间,数据的一致性。
- 数据版本控制:相当于为被监控的键设置了一个版本标记。当键的值发生变化时,版本标记改变,事务如果依赖这些键的值,就会因版本不匹配而失败,从而防止脏数据的写入。
实际应用场景
- 银行转账场景
- 场景描述:在银行转账操作中,需要从一个账户扣除一定金额,并将该金额添加到另一个账户。假设两个账户的余额分别存储在Redis的两个键
account1
和account2
中。 - 使用方式:首先使用
WATCH account1 account2
监控这两个账户余额的键。然后开启事务,在事务中执行从account1
减去转账金额,向account2
增加转账金额的操作。如果在WATCH之后到事务执行之间,account1
或account2
的值被其他客户端修改(比如同时有另一个转账操作在进行),那么当前事务的EXEC命令会失败,客户端可以捕获这个错误并重新执行整个转账流程,从而保证转账数据的一致性。
- 场景描述:在银行转账操作中,需要从一个账户扣除一定金额,并将该金额添加到另一个账户。假设两个账户的余额分别存储在Redis的两个键
- 库存管理场景
- 场景描述:在电商系统的库存管理中,商品库存数量存储在Redis的一个键
product_stock
中。当有用户下单时,需要减少库存数量。 - 使用方式:使用
WATCH product_stock
监控库存键。开启事务,在事务中执行检查库存是否足够,如果足够则减少库存数量的操作。如果在WATCH之后到事务执行之间,库存被其他订单修改(比如有其他用户同时下单),事务的EXEC命令将失败,客户端可以重新检查库存并决定是否重试下单操作,确保库存数据的准确性和一致性。
- 场景描述:在电商系统的库存管理中,商品库存数量存储在Redis的一个键
- 分布式计数器场景
- 场景描述:在分布式系统中,使用Redis的计数器来统计某些事件的发生次数,如网站的访问量。多个客户端可能同时对计数器进行增加操作。
- 使用方式:客户端在增加计数器之前,使用
WATCH counter_key
监控计数器键。开启事务,在事务中读取当前计数器的值,增加一定数量,然后写回新的值。如果在WATCH之后到事务执行之间,计数器被其他客户端修改,事务的EXEC命令失败,客户端可以重新读取并增加计数器,保证计数器数据的一致性。