Redis可以实现分布式锁,主要有以下几种方案:
- SETNX + EX方法
使用SETNX抢占redis的一个key作为锁,同时给这个key设置一个过期时间。
具体实现:
SETNX lockKey someValue # 尝试获取锁
EX lockKey 30 # 设置30秒超时时间
# 获取锁成功后,执行任务代码
DEL lockKey # 执行完成后,删除锁
优点:实现简单,效率高。
缺点:存在脸fichier失效问题。
- SET + EXISTS 方法
使用SET设置锁键,再用EXISTS判断锁键是否存在。
具体实现:
SET lockKey someValue
if exists lockKey:
# 锁已存在,失败获取锁
else:
# 获取锁成功,执行任务代码
DEL lockKey # 释放锁
优点:避免了SETNX的逐渐失效问题。
缺点:效率比SETNX低。
- WATCH + MULTI + EXEC方法
使用Redis事务,保证获取锁的原子性。
具体实现:
WATCH lockKey
if redis.get(lockKey) == null:
redis.multi()
redis.set(lockKey, 'value')
redis.exec()
# 获取锁成功,执行任务代码
redis.unwatch()
redis.delete(lockKey) # 释放锁
优点:不会产生逐渐失效问题,最安全。
缺点:效率比上面2种低。
总的来说,上述3种方案各有优缺点:
- SETNX + EX: 效率高,但存在逐渐失效
- SET + EXISTS: 避免逐渐失效,但效率低于SETNX
- WATCH + MULTI : 最安全,但效率最低
因此需要根据实际情况,综合考虑效率和安全性来选择合适的方案。