【Redis】Redis典型应用-分布式锁
import redis
import uuid
import time
# 连接Redis
client = redis.StrictRedis(host='localhost', port=6379, db=0)
# 尝试获取分布式锁的函数
def acquire_lock(lock_key, acquire_timeout=10, lock_timeout=10):
identifier = str(uuid.uuid4()) # 生成一个唯一的ID
end = time.time() + acquire_timeout
while time.time() < end:
if client.set(lock_key, identifier, ex=lock_timeout, nx=True):
# 如果设置成功,表示获取到锁
return identifier
time.sleep(0.001)
return False
# 释放分布式锁的函数
def release_lock(lock_key, identifier):
pipe = client.pipeline(True)
while True:
try:
# 检查锁是否是当前的ID
pipe.get(lock_key)
current_identifier = pipe.execute()[0]
if current_identifier == identifier:
# 如果是当前的ID,则删除锁
pipe.delete(lock_key)
pipe.execute()
return True
else:
# 如果不是当前的ID,则不释放锁
return False
except Exception as e:
# 发生异常,重试
continue
# 使用示例
lock_key = "my_lock"
lock_identifier = acquire_lock(lock_key)
if lock_identifier:
try:
# 在这里执行需要互斥访问的代码
print("获取锁成功,执行操作...")
finally:
# 释放锁
if release_lock(lock_key, lock_identifier):
print("释放锁成功")
else:
print("释放锁失败")
else:
print("获取锁失败")
这段代码展示了如何使用Redis实现分布式锁。首先,我们连接到Redis服务器。然后,我们定义了acquire_lock
函数来尝试获取锁,如果在指定时间内成功,它会返回一个唯一的标识符;否则,它会返回False
。release_lock
函数尝试释放锁,它会检查锁是否是由指定的标识符所拥有,如果是,它会释放锁。使用示例中演示了如何在获取锁之后执行代码,并在最后确保释放锁。
评论已关闭