分布式锁

分布式锁 核心思路

1.采用数据库

不建议,性能不好。jdbc

2.采用redis 实现分布式锁(sentnx)(重点分析)

sentnx可以存入key 如果存入成功key 返回1,失败返回0

解释setnx 命令作用:

可以写入key 操作。可以获取返回结果。结果只有 0,1
返回1 key之前不存在,写入成功。返回0表示key之前存在 写入失败。

Set命令返回OK,可以覆盖原来key的值

多个客户端(jvm )使用setns命令方式,创建相同key ,redis不允许key重复。返回1表示创建成功,获得锁。没有创建成功的jvm 进行等待。

如何释放锁?

执行完操作,删除key 。每个key有自己对应的有效期。
如果删除失败,会导致死锁。
解决办法:一定要设置有效期!!!!
设置有效期是为了解决死锁问题。

释放锁2种方式:

1。key设置了有效期
2,程序结束 主动删除key(统一把锁才能删除)
注意:a上锁,只能a删除自己的上的锁。不能删别人的锁。

2个超时时间:

1,规定时间获取不到锁,放弃
2,获取到锁,设置有效期。
有效期注意是以秒为单位。一般都是毫秒单位,用的时候要除以1000

3.zookeeper实现分布式锁

zk是一个分布式协调工具
当多个客户端(jvm )在zk上创建相同一个临时节点
临时节点要保证唯一
谁能够创建成功 谁就能拿到锁
没拿到锁 失败的会进行等待 等待别人释放锁后 会通过事件通知给客户端重新获取锁资源

zk通过什么防止死锁?

临时节点 设置session有效期 (链接时间)规定时间,连接断开,会话结束,删除临时节点,释放锁

多台服务器集群 只能保证一个Jvm进行操作

redis 分布式锁和zk 分布式锁不同在于:释放锁不同!!!!

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值