首先说一下锁的理解,是指对资源的独占使用,具备排他性,在某些业务情景是必要条件,但不能乱用,由于好比会对性能有很大的影响。java
用java举例子,在单机器的状况下能够经过Synchronized或者ReentrantLock,对须要加锁的资源枷锁能够是类方法或者类属性、变量等。redis
随着互联网的兴起,大部分互联网业务单机已经没法支撑,所以大量的分布式设计应运而生,这时候在单机上容易实现的锁就不是那么简单和直接了。数据库
目前主流的分布式锁的实现方式有三种:缓存
1.借助数据库来实现,新建一张锁表分布式
操做前向表添加一条锁记录(锁id创建惟一索引),成功添加者得到锁权限,处理完后删除锁记录来释放锁,这种方法弊端较多,固然也都有应对措施,好比但节点故障问题,解锁失败会死锁问题,对应的解决方案有数据库集群,定时间清理死锁数据,这里没有列全能够本身模拟体会。此种方式并非主流的实现方式。固然也能够经过 for update的 排他锁来实现,这种方式就须要注意数据库必须是innodb的引擎。性能
2.基于缓存实现,如memcache 和 redis设计
memcache的add操做具备原子性,能够保证同一个key add操做只有一个成功,来获取锁权限,利用缓存的失效时间来解决死锁问题。相对于第一种方案,这种方案性能更好,并且操做更方便。索引
3.经过zookeeper实现,这个目前来讲最主流的解决方案资源
原理简介,客户端会在zookeeper生成一个临时的目录节点,存储在一个序列中,每次节点序号最小的节点对应的客户端得到锁,处理完成后删除最小节点,并且可重复获取锁(经过判断序号是否和最小的节点相同)。innodb
分布式特色解决了单点故障问题,并且相对于前两种方式,这种方式能够实现阻塞分布式锁,和锁的重复获取问题。
若有理解错误,或者您有更好的理解欢迎指正,万分感谢
技术交流qq群:208779755
欢迎关注我的公众号