Python Web项目中怎么做分布式锁防并发冲突_使用redis-py实现SETNX与Lua原子脚本
直接用 SETNX 不够安全,因其无法原子性完成设置值、过期时间和防误删三件事,易导致死锁或锁被误删;需结合 SET ... NX EX 和 Lua 脚本校验锁归属来保障安全性。
为什么直接用 SETNX 不够安全?
因为 SETNX 只能保证“设置键不存在时才写入”,但无法同时完成“设置值 + 设置过期时间 + 防误删”三件事。常见错误是先 SETNX 成功,再用 EXPIRE 设过期——如果进程在中间崩溃,锁就永远不释放,变成死锁。
更隐蔽的问题是:多个客户端都以为自己持锁成功,结果同时执行临界区逻辑。典型表现是数据库重复插入、库存扣减为负、任务被重复调度。
- Redis 2.6.12+ 支持
SET key value EX seconds NX命令,可原子完成“存在性判断 + 写入 + 过期”,但依然没解决“谁删谁的锁”问题 - 若客户端A持有锁,超时后自动释放,此时客户端B获取到锁;而A还在执行,结束后却执行了
DEL,把B的锁给删了 - 所以必须让“校验锁归属 + 删除”也原子化,只能靠 Lua 脚本
用 redis-py 实现带校验的 Lua 分布式锁
核心思路:加锁时写入唯一标识(如 UUID 或进程 ID),解锁时只允许该标识删除自己的锁。Lua 脚本在 Redis 端执行,天然原子。
示例脚本(保存为 unlock.lua):
if redis.call("GET", KEYS[1]) == ARGV[1] then
return redis.call("DEL", KEYS[1])
else
return 0
end
Python 中调用方式:
Clippah
AI驱动的创意视频处理平台
- 加锁:用
set(name, value, ex=30, nx=True),其中value是随机字符串(推荐uuid.uuid4().hex) - 解锁:预载 Lua 脚本,传入 key 和相同 value:
unlock_script(keys=[lock_key], args=[lock_value]) - 务必检查返回值:加锁返回
True/False,解锁返回1表示删除成功,0表示锁已被改或不存在
锁的超时时间怎么设才合理?
设太短:业务还没执行完锁就过期,其他客户端趁虚而入;设太长:出错后恢复慢,影响系统吞吐。这不是拍脑袋决定的,得结合实际。
- 先压测单次临界操作耗时,取 P99 值,再乘以 1.5~2 倍作为基础超时(比如 P99 是 800ms,初设为 2s)
- 如果业务中可能阻塞(如调第三方 API、大文件 IO),必须显式做超时控制,并在超时前主动续锁(
GETSET或PEXPIRE)——但续锁本身也有竞态,生产环境建议用 Redlock 或成熟库如redis-lock - Redis 主从异步复制下,主节点写入锁后宕机,从节点升主,原锁可能丢失。严格场景需考虑 Redlock,但多数 Web 场景用单实例 + 合理超时已足够
哪些地方最容易漏掉导致锁失效?
不是写了 SETNX 就算用了分布式锁,很多细节一漏,等于没锁。
- 没校验
set()返回值:redis.set(..., nx=True)失败返回None,不判断就直接进业务逻辑,相当于没锁 - 解锁不用 Lua,而是简单
DEL:这是最常见误用,会导致锁被误删 - 锁 key 没带业务上下文:比如全用
"order_lock",不同订单互相干扰。应拼接业务 ID,如f"order_lock:{order_id}" - 异常路径没解锁:try/except 里忘了
finally或没捕获所有异常类型(比如KeyboardInterrupt、SystemExit),锁会残留
真正难的从来不是写几行 Lua,而是把锁的生命周期和业务流程对齐——超时、重试、清理、监控,缺一不可。
如非特殊说明,本站内容均来自于网友自主分享,如有任何问题均请联系我们进行处理!
猜您喜欢
迷你世界地狱传送门怎么做2026版
2026-07-11迷你世界游戏里面有很多的内容,今天给大家带来了游戏里面的最新地狱传送门制作方法,还有小伙伴不清楚要怎么去制作,那么下面就是相关的内容,来看看吧. 迷你世界最新地狱传送门制作方法 1.在迷你世界,做传送门要准备两个材料,其中之一是地心门框,通过远古宝石、黑晶石、岩石块和岩浆铁桶合成。 2.另外一个材料就是地心传送门块,通过四个地心传送门碎片合成。 3.接着在空白的场地上建一个宽4高5的地心门框,中间...
我的世界怎么做刷怪塔效率高2026年版
2026-07-11我的世界中有很多道具,今天给大家带来的是高效率制作刷怪塔方法,还有很多的小伙伴不清楚要怎么去制作,那么下面就为大家带来了相关的制作方法. 我的世界2026高效率制作刷怪塔方法 在离地面一定高度(一般是128格以上)的地方建造一个刷怪平台,平台的形状可以是回字形、十字形或平台型,平台的面积越大,刷怪效率越高。 一:选址与规划 首先,我们要选择一个远离其他建筑物且相对平坦的区域,这样才能确保怪物不受干...
迷你世界怎么做完整的工匠台2026
2026-07-11迷你世界游戏里面有很多的内容,今天给大家带来了游戏里面的完整的工匠台最新制作方法,还有小伙伴不清楚怎么做完整的工匠台,那么下面就是相关的内容. 迷你世界完整的工匠台最新制作方法 一,首先进入游戏,然后在地面上放置不完整的工匠台 二,接着打开背包,在背包中搜索并选择点击创造晶块 三,点击创造晶块后,使用创造晶块来点击不完整的工匠台,即可升级为完整的工匠台 本文内容来源于互联网,如有侵权请联系删除。
迷你世界刷怪塔怎么做2026
2026-07-09迷你世界里面的刷怪塔是可以让我们来刷取经验的道具之一,今天给大家带来的是刷怪塔的一个制作的方法,还有很多的小伙伴不清楚,那么下面就是具体的内容. 迷你世界刷怪塔最新制作方法 1、刷怪平台(击杀怪物的位置)高度要在100以上,建议120左右,因为在玩家附近96格以内是不会刷新怪物的。 2、用于收集怪物的掉落的收集器。注意漏斗的接口方向,要互相连通并接入箱子。 3、怪物摔落的“井”高度为16格,刚好可...
迷你世界草木灰怎么做
2026-07-09迷你世界游戏里面有很多的材料道具可以去获得,今天给大家带来了游戏里面的草木灰制作方法,还有小伙伴不清楚要怎么去制作,那么下面就是相关的内容. 迷你世界草木灰制作方法 首先要准备一些苔藓球; 然后把苔藓球丢到熔炉里面; 等铁炉把苔藓球烧完即可获得草木灰。 本文内容来源于互联网,如有侵权请联系删除。
我的世界魔法金属模组武器怎么做
2026-07-03我的世界里面有很多的模组,今天给大家带来了游戏里面的魔法金属模组武器合成表大全,还有小伙伴不清楚这个模组的武器怎么合成,下面就是具体的内容. 我的世界魔法金属模组武器合成表大全 魔法指挥号角 合成表: 本文内容来源于互联网,如有侵权请联系删除。
MiMo Code:AI 自动编码如何辅助构建高并发缓存逻辑
2026-06-28MiMoCode是能理解项目上下文、拆解工程目标并协同执行多阶段任务的终端编码代理,擅长高并发缓存等系统级任务,具备上下文感知、Compose模式驱动、持久记忆、安全编辑与静态分析能力。 ☞☞☞AI智能聊天,问答助手,AI智能搜索,多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ MiMoCode不是简单补几行代码的助手,而是能理解项目上下文、拆解工程目标、协同执行多阶段任务的终端编码代理。构建高...
迷你世界床怎么做2026
2026-06-27迷你世界游戏里面有很多的道具可以去制作,今天给大家带来了游戏里面的床制作方法,还有小伙伴不清楚要怎么制作,那么下面就是相关的内容. 迷你世界床制作方法 床通过工具箱合成,合成需要3个羊毛+3块木板(只要是木板都行没有指定树的类型) 本文内容来源于互联网,如有侵权请联系删除。
迷你世界钻石矿镐怎么做
2026-06-27迷你世界游戏里面有很多的道具可以去制作,今天给大家带来了游戏里面的钻石矿镐制作方法,还有小伙伴不清楚要怎么制作,那么下面就是相关的内容. 迷你世界钻石矿镐制作方法 合成需要:钻石X3、小木棍X2 近战伤害+5 采矿工具,速度特别快,可采高级矿 本文内容来源于互联网,如有侵权请联系删除。
迷你世界剪刀怎么做
2026-06-27迷你世界游戏里面有很多的道具材料,今天给大家带来了游戏里面的剪刀制作方法,还有小伙伴不清楚剪刀怎么做,那么下面就是相关的内容. 迷你世界剪刀制作方法 先挖矿获得铁矿,然后用熔炼炉烧成铁锭,然后用工具箱合成剪刀。 本文内容来源于互联网,如有侵权请联系删除。
