分布式锁实现的三种方式

要实现分布式锁,需要满足以下功能

1、同一线程可重入

2、有高可用的获取&释放锁

3、获取锁&释放锁性能好

4、这把锁最好是组阻塞的

5、分布式锁解决是在集群环境下,只能有一个线程在同一时刻进入某一个方法

实现分布式锁的三种方法

1、数据库(乐观锁--insert 一条记录,此记录的方法名做为唯一索引,插入成功认为获取到锁),排它锁(for update方法),此方法需要将方法名加唯一索引,否则是表锁,不是行锁)

2、redis(setnx) 设置自过过期时间,设置 value 为 requestid,可以判断重入)

3、zookeeper (每个客户端在获取锁时,创建一个瞬时节点,如果这个节点的值是所有节点中最小的,则认为他获得了锁,zookeeper的瞬时节点创建是有序的,最先创建的序号就要小,所有利用这个特性,就可以判断每个请求是否能获取这把锁了,最小的,一定是最先请求的。请求结束后,这节点会自动删除 ) 它做到了可重入(对比结点的值是否相同,相同就可以获取),阻塞式锁(当没有拿到锁时,可以设置一个节点的监听,如果节点发生变化,则再做判断自已是不是最小的)。缺点:性能不好,所有的节点的值的下发是通过leader来下发到follower机器上的。还有,有可能有并发的问题,若客户与zookeeper服务器断了,则zookeeper会自动删除 这节点,假如一客户端拿到了这把锁,还没有释放,由于网络的问题,zookeeper认为连接不上了,就会删除 这个锁,其它客户端就能拿到这把锁了 ),

 

你可能感兴趣的:(架构)