面试题答案
一键面试基本步骤
- 生成唯一标识:在客户端生成一个唯一的标识,例如使用UUID(通用唯一识别码)。这个标识将作为锁的持有者标识,用于后续的解锁操作,确保只有加锁的客户端才能解锁。
- 尝试获取锁:使用Redis的
SETNX
(SET if Not eXists)命令尝试获取锁。SETNX
命令只有在键不存在时,才会设置键的值。如果返回值为1,表示成功获取锁;返回值为0,表示锁已被其他客户端持有。 - 设置锁的过期时间:为了防止死锁(例如持有锁的客户端崩溃而未能释放锁),需要为锁设置一个过期时间。可以在获取锁成功后,使用
EXPIRE
命令设置过期时间;或者在Redis 2.6.12及以上版本,可以在使用SETNX
时通过额外参数直接设置过期时间,如SET key value NX EX seconds
。
常用命令
- SETNX:尝试设置键的值,仅当键不存在时设置成功。
SETNX lock_key unique_value
lock_key
是锁的键名,用于标识这个锁。unique_value
是之前生成的唯一标识。
- EXPIRE:设置键的过期时间,以秒为单位。
EXPIRE lock_key expiration_time
lock_key
是锁的键名。expiration_time
是锁的过期时间(秒)。
- GET:获取键的值,用于检查锁是否存在以及获取锁的持有者标识。
GET lock_key
lock_key
是锁的键名。
- DEL:删除键,用于释放锁。在释放锁时,需要先检查锁的持有者标识是否与当前客户端的标识一致,防止误删其他客户端持有的锁。
DEL lock_key
lock_key
是锁的键名。在实际应用中,应该先通过GET
命令获取锁的值,与当前客户端持有的唯一标识对比,只有一致时才执行DEL
操作。