面试题答案
一键面试使用SET命令扩展参数实现分布式锁的步骤:
- 获取锁:使用
SET key value NX PX milliseconds
命令。其中key
是锁的标识,在分布式系统中全局唯一;value
一般为一个随机值,用于标识当前获取锁的客户端,以便后续解锁操作;NX
表示只有当key
不存在时才进行设置操作,保证了锁的原子性获取;PX milliseconds
设置锁的过期时间(以毫秒为单位),防止因客户端崩溃等原因导致锁无法释放。例如:SET lock_key unique_value NX PX 10000
,表示获取名为lock_key
的锁,设置值为unique_value
,如果锁不存在则设置成功且锁的过期时间为10秒。 - 业务操作:当获取锁成功后,客户端即可执行需要加锁保护的业务逻辑。
- 释放锁:客户端完成业务操作后,需要释放锁。通过使用Lua脚本来保证解锁操作的原子性。Lua脚本首先检查锁的
value
是否与当前客户端设置的unique_value
一致,如果一致则执行DEL key
命令删除锁。示例Lua脚本如下:
if redis.call("GET",KEYS[1]) == ARGV[1] then
return redis.call("DEL",KEYS[1])
else
return 0
end
通过EVAL script numkeys key [key ...] arg [arg ...]
命令执行该Lua脚本,numkeys
为键的数量,key
为锁的key
,arg
为设置锁时的unique_value
。
相较于其他实现方式的优势:
- 原子性:
SET
命令扩展参数NX
选项确保了锁的获取操作是原子的,避免了并发情况下多个客户端同时获取到锁的问题。 - 简单高效:实现方式相对简单,不需要引入复杂的分布式协调机制或中间件。仅通过Redis的基本命令和Lua脚本就能完成锁的获取与释放,减少了系统复杂度和维护成本。
- 灵活性:可以通过设置不同的过期时间来满足不同业务场景的需求。例如对于短时间的操作可以设置较短的过期时间,减少锁的持有时间,提高系统并发性能;对于长时间的操作则可以设置较长的过期时间,确保业务操作完成。
- 支持高并发:Redis本身是一个高性能的内存数据库,具备处理高并发请求的能力。使用Redis实现分布式锁能够很好地适应高并发的分布式系统环境,提供高效的锁服务。