☰
Redis锁为什么会误删
2026/9/28 20:55:27 网站建设 项目流程


最近排查一个 PHP 项目时遇到过这种情况:系统已经用 Redis 做了分布式锁,理论上同一任务只能执行一次,但高峰期还是偶尔出现重复处理。更奇怪的是,日志里能看到锁确实创建成功,却会在任务还没结束时突然被其他请求抢到。

继续对照时间线后发现,问题出在锁过期以后。

原来的代码通过SET key value NX EX 10创建一个 10 秒锁,业务正常情况下几秒就能结束。但偶尔第三方接口变慢,任务执行超过 10 秒后,Redis 会自动删除旧锁。此时第二个请求就能重新获得同一个锁。

真正危险的是,第一个请求执行结束后还会直接执行DEL key。如果这时候锁已经属于第二个请求,第一个请求就会把别人的锁删掉,第三个请求又可以继续进入,重复执行就这样出现了。

后来给每次加锁生成唯一随机值,释放锁时先判断 Redis 中保存的值是否仍然属于当前请求,再执行删除。为了避免“判断完成后锁又发生变化”,判断和删除通过 Lua 脚本一次完成。对于执行时间不确定的任务,还会根据业务情况增加锁续期机制。

现在使用 Redis 锁时,我不会只看有没有NX。锁的过期时间、唯一标识、释放方式和异常退出都要一起考虑。分布式锁真正难处理的地方,往往不是怎么加锁,而是怎样确保只释放自己的锁。

#PHP开发 #Redis #分布式锁 #并发处理

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询