面试题答案
一键面试- 加锁:
- 客户端使用
SETNX
(SET if Not eXists
)命令尝试获取锁。例如,假设要操作的数据键为data_key
,可以使用一个锁键lock_key
,执行SETNX lock_key value
,其中value
可以是一个唯一标识,比如客户端生成的 UUID。如果SETNX
命令返回1
,表示成功获取锁,可以继续后续操作;如果返回0
,表示锁已被其他客户端持有,当前客户端需要等待或重试。
- 客户端使用
- 操作数据:
- 成功获取锁的客户端在事务中执行对数据的操作。例如,如果是对
data_key
进行递增操作,可以使用 Redis 的事务,如:
MULTI INCR data_key EXEC
- 成功获取锁的客户端在事务中执行对数据的操作。例如,如果是对
- 解锁:
- 操作完成后,客户端使用
DEL
命令释放锁,即执行DEL lock_key
。在释放锁时要确保只有获取锁的客户端才能释放,所以可以在释放锁之前验证lock_key
的value
是否与获取锁时设置的value
一致,防止误释放其他客户端的锁。
- 操作完成后,客户端使用
另外,为了避免死锁情况,可以为锁设置一个过期时间。例如,在获取锁成功后,使用 EXPIRE lock_key seconds
命令为锁设置一个过期时间 seconds
,这样即使客户端在操作过程中出现故障未能及时释放锁,锁也会在一定时间后自动过期,其他客户端可以获取锁继续操作。