赞
踩
分布式锁(数据库、redis(redis主要看下面那篇,这里仅参考)、zk)
分布式锁zk:
步骤:创建一个目录,加锁就在该目录下创建节点,解锁就删除节点, 创建的节点是临时顺序节点,该目录下的兄弟节点,最小的节点获得锁,每个节点监听前一个节点,如果前一个节点删除了,也就是解锁了,则表示自己是最小节点,从而可以加锁。
原由:
1. 用临时节点是为了防止死锁,如果一个节点获得了锁,然后挂掉了,则就只能一直占有锁,因此通过临时节点就可以解决该问题,服务挂掉,节点就会自动删除,从而解锁
2. 用临时顺序节点是为了解决节点释放时需要通知所有的服务,则就会占用大量的资源和带宽,通过顺序节点就只需要每个节点监听前一个节点,从而合理利用资源
其他:
1. 如果因为网络抖动,zk就会误以为服务挂了,从而删除临时节点,因此需要重试机制,多次重试之后还不行,才会删除临时节点
2. 对于锁的可重入,只需要带上线程信息或者机器信息等唯一的标识,获取的时候判断一下就行了
redis锁和zookeeper锁区别:
1、redis分布式锁,其实需要自己不断去尝试获取锁,比较消耗性能。
2、zk分布式锁,获取不到锁,注册个监听器即可,不需要不断主动尝试获取锁,性能开销较小。
3、zk需要频繁的创建和删除节点,性能上不如Redis方式。
4、redis获取锁的那个客户端bug了或者挂了,那么只能等待超时时间之后才能释放锁。
5、而zk的话,因为创建的是临时znode,只要客户端挂了,znode就没了,此时就自动释放锁。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。