以下是使用Redis实现分布式锁的详细步骤和示例代码:
分布式锁需要满足三个关键特性:
import redis
import uuid
client = redis.Redis()
def acquire_lock(lock_key, expire_time=10):
identifier = str(uuid.uuid4()) # 唯一标识锁持有者
# 原子操作:只有当key不存在时才设置,并设置过期时间
result = client.set(lock_key, identifier, nx=True, ex=expire_time)
return identifier if result else None
def release_lock(lock_key, identifier):
# 使用Lua脚本保证原子性:先验证值再删除
lua_script = """
if redis.call("get", KEYS[1]) == ARGV[1] then
return redis.call("del", KEYS[1])
else
return 0
end
"""
return client.eval(lua_script, 1, lock_key, identifier)
lock_key = "order_lock"
identifier = acquire_lock(lock_key)
if identifier:
try:
# 执行业务逻辑(如创建订单)
print("Processing critical section...")
finally:
# 确保最终释放锁
release_lock(lock_key, identifier)
else:
print("Failed to acquire lock")
方案 | 优点 | 缺点 |
---|---|---|
Redis单节点 | 简单高效 | 存在单点故障风险 |
RedLock | 高可用 | 实现复杂,性能开销大 |
Zookeeper/etcd | 强一致性,天然支持锁 | 吞吐量较低,依赖外部系统 |
根据业务场景选择合适方案,多数Web应用使用Redis单节点方案即可满足需求。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。