面试题答案
一键面试常见业务场景
- 库存扣减:在电商系统中,当多个用户同时抢购同一商品时,库存数量有限,需要保证库存数据的准确性和一致性,避免超卖现象。
- 订单创建:多个用户同时下单,要防止重复创建订单,保证订单数据的唯一性和正确性。
- 分布式系统中的资源竞争:例如分布式文件系统中,多个节点可能同时尝试对同一文件进行写入操作,需要通过分布式锁保证同一时间只有一个节点能进行写入,避免数据冲突。
- 数据同步:在分布式数据库之间进行数据同步时,防止不同节点同时进行同步操作导致数据不一致。
Redis分布式锁在这些场景中的作用
- 获取锁:在执行库存扣减、订单创建等操作前,先通过Redis的
SETNX
(SET if Not eXists)命令尝试获取锁。如果获取成功,表示当前实例获得了操作权限,可以继续执行后续的数据操作;如果获取失败,说明已经有其他实例在执行相关操作,当前实例需要等待或重试。 - 操作执行:获取锁成功的实例开始执行MySQL数据操作,如在库存扣减场景中,从MySQL数据库中查询当前库存,判断库存是否足够,然后进行扣减操作。在订单创建场景中,向MySQL数据库插入订单相关数据。
- 释放锁:在数据操作完成后,通过Redis的
DEL
命令释放锁,让其他实例有机会获取锁并执行操作。为防止程序异常导致锁未释放,一般会给锁设置一个过期时间,确保在一定时间后锁会自动释放。这样可以保证即使获取锁的实例出现故障,其他实例也能在一段时间后获取锁并继续执行任务,避免死锁情况发生,从而确保MySQL数据操作的隔离性,避免并发操作带来的数据不一致问题。