redis分布式锁解决业务处理时间超过锁失效时间的问题
回顾redis分布式锁
获取锁成功后为了防止客户端进程失败无法正常释放锁进而导致其他的客户端再也获得不到锁,在使用SETNX的时候我们还需要为每个锁加一个过期时间Expire Time, 这样即使在客户端不能正常释放锁的情况下,过期时间到了之后,Redis会自动释放掉锁来让别的客户端能够继续申请锁。这就是一种典型的租约机制,客户端申请了一个租约时长为lock_timeout的锁,客户端可以在租约期间使用完之后正常释放锁,如果过了租约时间,即使客户端没有释放锁,Redis也会自动释放掉这个锁。
问题:
这个租约日期设置的时间长短是个问题
如果设置的过短,那么就可能客户端还没用完锁,锁就被Redis给释放了,造成后续多个客户端同时访问某资源的错误,如果设置的时间过长,那么当客户端因为failure不能正常释放锁的时候,其他客户端就需要等待较长的时间(时间过了锁的租约期)才能够重新释放锁。
解决方法
方法1:定时自动去续约(expire key second)
具体操作:
搞一个watchdog:当我们并不知道自己将会用多久的锁时,我们为该锁设置一个较小的lock_timeout,同时每隔一段时间在该锁过期之前,就自动的向服务器延长该锁的lifetime。
参考[https://zhuanlan.zhihu.com/p/101913195]
方法2:记录业务处理时长,设置过期时间:业务时长+一定时间
具体操作
每次获取锁后,记录业务代码执行的时长,在redis中存一个上次时长,再次获取锁时 设置过期时间为上次时长+N秒
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具