分布式锁的实现原理和三种实现方式

首先说一下锁的理解,是指对资源的独占使用,具有排他性,在某些业务情景是必要条件,但不能乱用,因为比如会对性能有很大的影响。

用java举例子,在单机器的情况下可以通过Synchronized或者ReentrantLock,对需要加锁的资源枷锁可以是类方法或者类属性、变量等。

随着互联网的兴起,大部分互联网业务单机已经无法支撑,因此大量的分布式设计应运而生,这时候在单机上容易实现的锁就不是那么简单和直接了。

目前主流的分布式锁的实现方式有三种:

1.借助数据库来实现,新建一张锁表

操作前向表添加一条锁记录(锁id建立唯一索引),成功添加者获得锁权限,处理完后删除锁记录来释放锁,这种方法弊端较多,当然也都有应对措施,比如但节点故障问题,解锁失败会死锁问题,对应的解决方案有数据库集群,定时间清理死锁数据,这里没有列全可以自己模拟体会。此种方式并不是主流的实现方式。当然也可以通过 for update的 排他锁来实现,这种方式就需要注意数据库必须是innodb的引擎。

2.基于缓存实现,如memcache 和 redis

memcache的add操作具有原子性,可以保证同一个key add操作只有一个成功,来获取锁权限,利用缓存的失效时间来解决死锁问题。相对于第一种方案,这种方案性能更好,而且操作更方便。

3.通过zookeeper实现,这个目前来说最主流的解决方案

原理简介,客户端会在zookeeper生成一个临时的目录节点,存储在一个序列中,每次节点序号最小的节点对应的客户端获得锁,处理完成后删除最小节点,而且可重复获取锁(通过判断序号是否和最小的节点相同)。

分布式特点解决了单点故障问题,而且相对于前两种方式,这种方式可以实现阻塞分布式锁,和锁的重复获取问题。

如有理解错误,或者您有更好的理解欢迎指正,万分感谢

技术交流qq群:208779755

欢迎关注个人公众号

 

转载于:https://my.oschina.net/haitaohu/blog/1841724

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值