实现redis锁
一个分布式系统需要一起更新redis,为了防止重复写入,需要实现一个redis的写入保护锁。
用redis的set, nx=true,
NX
:只在键不存在时,才对键进行设置操作。 SET key value NX
效果等同于 SETNX key value
。
key_value 用一个token,可以用timestamp替代,用来确保自己操作的是本身锁的key。
expire_time 设置一个锁的过期时间
def redis_lock(lock_key, key_value, expire_time): return r.set(lock_key, key_value, nx=True, ex=expire_time) def redis_unlock(lock_key, key_value): if r.get(lock_key) is None: return elif r.get(lock_key).decode("utf8") == str(key_value): return r.delete(lock_key) else: return
使用例子
lock_time = time.time() if rh.redis_lock(_key, lock_time, 2): # do something rh.redis_unlock(_key, lock_time)