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