面试题答案
一键面试Redis分布式锁实现原理核心操作
- SETNX 命令:
- 作用:SETNX 是“SET if Not eXists”的缩写,即当且仅当 key 不存在时,才对 key 进行设置操作。在分布式锁实现中,多个客户端同时尝试使用 SETNX 命令去设置同一个 key(通常作为锁标识),只有一个客户端能够成功设置,该客户端就获得了锁。其他客户端设置失败,表明锁已被占用,只能等待锁的释放。例如,在一个电商抢购场景中,多个用户同时请求购买限量商品,通过 SETNX 来确保只有一个用户能获得购买锁,避免超卖。
- 处理锁的过期时间:
- 避免死锁:为了防止获得锁的客户端因为某些原因(如程序崩溃、网络故障等)未能及时释放锁,导致其他客户端永远无法获取锁(死锁情况),需要为锁设置一个过期时间。可以在使用 SETNX 成功设置锁后,紧接着使用 EXPIRE 命令为 key 设置过期时间。例如:
SETNX lock_key unique_value EXPIRE lock_key expiration_time
- 优化方式:在 Redis 2.6.12 版本之后,可以使用 SET 命令的扩展参数来一步完成设置锁和设置过期时间的操作,语法为
SET key value [EX seconds] [PX milliseconds] [NX|XX]
。如SET lock_key unique_value EX 10 NX
,这样可以确保设置锁和设置过期时间这两个操作的原子性,进一步避免死锁。在实际应用中,过期时间的设置需要根据业务场景合理调整,时间过短可能导致锁频繁过期,业务处理未完成就丢失锁;时间过长则可能在客户端异常时,长时间占用锁资源。
- 避免死锁:为了防止获得锁的客户端因为某些原因(如程序崩溃、网络故障等)未能及时释放锁,导致其他客户端永远无法获取锁(死锁情况),需要为锁设置一个过期时间。可以在使用 SETNX 成功设置锁后,紧接着使用 EXPIRE 命令为 key 设置过期时间。例如: