redis实现分布式锁
使用setnx命令,此命令意为如果不存在,则设置值,存在则不会设置值。
存在的问题
当不设置过期时间时,如果线程获得锁之后死亡就会变成死锁
当设置过期时间时,如果线程获得锁之后处理业务时间过长,导致过期时间过期,就会使得锁释放,其他线程拿到了锁,当其处理完业务时,就会去释放其他线程获得的锁,会导致数据问题。
解决方法
可以使用一个守护线程给锁的过期时间续期,当处理业务时间过长时,当快要到达过期时间,就重置过期时长。
缺陷
redis最终还是存在当部署多个节点时,可能还是存在锁数据丢失情况,当然这是小概率事件,如果业务对于这种小概率事件可以忽略不计的话,那么就可以使用redis做分布式锁。
Zookeeper实现分布式锁
首先,Zookeeper会创建一个锁的节点,然后需要加锁的客户端请求zk加锁时,会在这个锁节点下创建一个临时节点,如果多个客户端请求,那么会按照请求的先后顺序创建临时节点,其中每个临时节点都会有一个顺序号,这个顺序号是由zk内部生成的;当客户端获取锁时,会判断这个锁节点下最小顺序号的临时节点是否是自己创建,如果是,则获取锁,如果不是,则监听自己的上一个临时节点。
zk释放锁就是删除自己创建的临时节点
当客户端宕机时,zk感应到,就会把它创建的临时节点删除。

2012

被折叠的 条评论
为什么被折叠?



