分布式锁解决方案

一:为什么需要分布式锁?
在传统的单机应用中,我们可以使用jvm层面的api实现锁来保证互斥控制,但是在分布式系统中,这种jvm域的锁就无法来实现对共享资源的控制了,这就需要使用分布式锁来结局分布式事务的问题了。
二:分布式锁所需要拥有的优点:
1:能够高性能的释放和获得锁
2:不会发生死锁
3:需要实现可重入锁
4:具备锁失效机制,不会发生死锁
5:具备阻塞锁特性,没有获得将继续等待获取锁
6:具备费阻塞锁特性,没有获得锁将直接返回获取锁失败。
三:分布式锁能解决什么问题?
1:分布式session一致性
2:分布式全局id生成
3:分布式事务解决方案
4:分布式锁实现方案
5:高并发的限流和降级
四:分布式锁解决方案
①基于数据库解决方案
可以新建一张表实现获得锁的时候就新增一条记录,释放锁的时候就删除该记录。这里需要设置method_name的唯一性约束。
缺点:
1:如果是单个数据库,数据库宕机后,就会导致业务不可用
2:没有失效时间,如果这个操作失败就会一直占用锁不会释放,导致其他线程无法获得锁
3:这把锁是非阻塞的,也是非重入的。
解决办法:
1:数据库集群
2:定时任务
3:非阻塞可以搞个while循环,知道插入成功
4:非重入:可以加几个字段,下次该线程再次进去直接分配
也可以使用数据库自带的排它锁。特别需要主要的是,使用inndb引擎的时候,默认给索引加上行级锁,如果索引失效会升级成表级锁,这个代价就比较大。
②基于缓存的分布式锁,本文主要介绍主流的缓存中间接redis.
使用redis有很多优势:
1:可以设置过期时间
2:互斥性
3:容错性:redis可以搭建集群,所有只要大部分节点能正常运行,客户端就可以加锁和解锁
4:不会发生死锁
实现:
加锁的过程就是set lock_key random-value px 5000.
解锁就是讲匹配random_value的值删掉就可以实现
③使用zookeeper实现
zookeeper本身就是为了分布式设计的,所以在实现分布式锁有很大的优势
创建一个mylock目录,将所有的线程获取锁的时候就会新建一个临时顺序节点A001,并建立监听机制,监听比自己大的节点是否释放锁
如果比自己大的节点释放锁,那么A001就获取节点,并执行业务,执行完就删除节点释放锁。让下一个节点获取锁。
三种实现方案的比较:
复杂程度:
zookeeper<redis<数据库
从性能
redis>zookeeper>数据库
从可靠性能
zookeeper>redis>数据库

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值