应用问题解决-分布式锁(LUA保证删除原子性)
问题:删除操作缺乏原子性
场景
1、index1获得锁、执行具体操作、比较lock的uuid值确实和自己生成的uuid是否相等,相等则删除锁。
uuid = v1
set(lock, uuid)
uuid.equals(get("lock"))
2、但是index1执行删除前,lock刚好过期时间已经到了,被redis自动释放
3、此时index2获取锁,执行具体操作,index1删除锁,结果把index2的锁删除了【因为index1已经比较过uuid相等了所以可以删除】
LUA脚本有一定的原子性,不会被其它命令插队,可以完成一些redis事务性的操作。
LUA脚本来保证删除的原子性
1、加锁
2、lua脚本保证删除的原子性操作
分布式锁的四个条件:
1、互斥性。在任意时刻,只有一个客户端能持有锁
2、不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其它客户端能加锁
3、解铃还系铃人:加锁和解锁必须是同一个客户端,客户端不能把别人加的锁解了
4、加锁和解锁必须具有原子性
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构