为什么要实现分布式锁,原来的锁不好用吗?
因为我们部署到单机的系统逐步演化为分布式系统,原有的锁机制只能保证在单机上某个资源在同一时间只有一个进程访问,而不能保证多台机器下某个资源同一时间只有一个进程访问。
单机redis分布式锁
获取锁:
set test_lock 1352 NX PX 30000
释放锁:
get test_lock
if value == 1352:
del test_lock
redis集群分布式锁——redlock
zookeeper分布式锁实现
我自己也做了一点总结:
首先客户端可以在zookeeper上创建节点,一共有四种节点,分别是持久节点、持久顺序节点、临时节点、临时顺序节点。持久节点的特性是客户端断开与zookeeper连接后节点仍存在,顺序节点的特性是会根据节点创建时间进行排序。
分布式锁应用的是临时顺序节点。
每一个试图抢占锁的线程都会在zookeeper上创建一个节点,并进行判断当前节点是否是第一个节点,如果是则获取锁成功,否则获取锁失败并进入等待状态,此时会在前一个节点注册watcher来监听前一个节点是否存在,以等待时机获取锁。
redis和zookeeper分布式锁的区别
分布式锁 | 优点 | 缺点 |
---|---|---|
redis | 1.有封装好的框架,容易实现 2.有等待锁的队列,大大提升抢锁效率。 | 添加删除节点效率低 |
zookeeper | set和del指令效率高 | 1.实现复杂,需要考虑超时,原子性,误删等情形。2.没有等待锁的队列,只能在客户端自旋来等待,效率低下。 |