面试题答案
一键面试锁的获取
- 设置合理的锁超时时间:在获取锁时,为每个锁设置一个合理的超时时间。例如,在使用
SETNX
命令获取锁后,紧接着使用EXPIRE
命令设置一个合适的过期时间(如SETNX lock_key value && EXPIRE lock_key 30
,30 秒为超时时间)。这样,如果某个业务逻辑执行时间过长,锁会自动过期释放,避免死锁。 - 使用随机值作为锁的值:每次获取锁时,设置一个随机的字符串作为锁的值。例如生成一个 UUID。这样在释放锁时,可以通过判断值是否匹配,只有持有锁的客户端才能释放锁,防止误释放其他客户端的锁。
锁的释放
- 采用原子操作释放锁:使用 Lua 脚本进行锁的释放操作,保证释放锁的操作是原子性的。如下 Lua 脚本示例:
if redis.call("GET", KEYS[1]) == ARGV[1] then
return redis.call("DEL", KEYS[1])
else
return 0
end
通过 EVAL
命令执行该脚本,传入锁的键和当前客户端设置的锁的值,只有当锁的值匹配时才会删除锁,确保安全释放锁,避免死锁。
2. 异常处理中释放锁:在业务逻辑执行过程中,无论发生任何异常,都要确保锁能被正确释放。可以在 try - catch
块的 catch
部分,调用释放锁的操作,保证程序健壮性,防止因异常导致锁无法释放而产生死锁。