分布式锁的进化过程

网友投稿 225 2022-09-12

分布式锁的进化过程

使用setnx 来作为锁的底层实现

case1  拿到锁 执行代码 但是如果此时服务器宕机就完了 case2 拿到锁 设置超时时间 然后执行代码     存在两个问题     2.1 设置超时时间和获取锁 得原子性完成    2.2 如果超时时间到了 任务还没有完成 怎么办?

2.2 存在两个问题    假如 a 先获得锁 设置十秒过期 a运行完成需要15s    b在第十秒拿到了锁 此时两个线程都拥有锁(第一个问题)    等到第15s,a删除了锁,此时b相当于没有锁的保护了,谁想进来就都能进来(第二个问题)

咱们先解决第二个问题      等到第15s,a删除了锁,此时b相当于没有锁的保护了,谁想进来就都能进来    给每个锁加一个编号,a拿到锁的时候,就设置编号,删除的时候,就只删除自己的锁    这样一来,第十秒的时候,a的那个锁的编号已经变成b设置的了    到第15s,a先拿到当前锁的值,然后和自己的编号比较 如果一样,再删除,这样就不会把b的锁删掉了。

这里还有一个问题    a先拿到当前锁的值,然后和自己的编号比较 如果一样,再删除    上面这段话没办法做到一致性    那怎么办?使用 Lua脚本

但是到目前为止,还有上面说的第一个问题    假如 a 先获得锁 设置十秒过期 a运行完成需要15s    b在第十秒拿到了锁 此时两个线程都拥有锁    那怎么办?a获取锁的时候,把超时时间设置到20s?那假如a运行需要25s呢?    请问,那锁的自动释放时间设置到多少毕竟合适呢?    有人回答是:根据系统自行设计。。。    我去,这不相当于没说!    那怎么办?咱们回忆一下,为什么要给锁设置超时时间?是怕我忽然宕机了,那个锁永远不删除,就卡死了。    那这样行不行,我拿到锁的时候,就不设置过期时间,然后每隔10s,就给redis发请求,把锁的过期时间设置为30s之后。    这样一来,如果我的服务器突然挂了,最多30s锁也就自动被清理了。    那怎么实现每隔10s,就去发请求,设置新的过期时间呢?    请参见Redission

我还有一个问题,那锁不设置过期时间,如果我的方法真的执行了100s或者更久怎么办?这不是卡死了别的现场?    如果你的方法真的执行了100s,与其让别的线程进来破坏了数据一致性,还不如让别的卡死呢!    另外如果你的方法真的执行了100s,你是不是该反思一下,是不是哪些逻辑没有设置超时时间

参考资料:

​​Redis 分布式锁|从青铜到钻石的五种演进方案 - 悟空聊架构的个人空间 - OSCHINA - 中文开源技术交流社区​​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:银行业务调度系统的实现
下一篇:网络营销外包应保持怎样的整合营销推广思路?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~