Redis 如何实现分布式锁?ZooKeeper 如何实现分布式锁?比较二者优劣?
分布式锁的三种实现:
基于数据库实现分布式锁;
基于缓存(Redis 等)实现分布式锁;
基于 Zookeeper 实现分布式锁;
数据库实现
Redis 实现
获取锁的时候,使用 setnx 加锁,并使用 expire 命令为锁添加一个超时时间,超过该时间则自动释放锁,锁的 value 值为一个随机生成的 UUID,通过此在释放锁的时候进行判断。
获取锁的时候还设置一个获取的超时时间,若超过这个时间则放弃获取锁。
释放锁的时候,通过 UUID 判断是不是该锁,若是该锁,则执行 delete 进行锁释放。
ZooKeeper 实现
创建一个目录 mylock;
线程 A 想获取锁就在 mylock 目录下创建临时顺序节点;
获取 mylock 目录下所有的子节点,然后获取比自己小的兄弟节点,如果不存在,则说明当前线程顺序号最小,获得锁;
线程 B 获取所有节点,判断自己不是最小节点,设置监听比自己次小的节点;
线程 A 处理完,删除自己的节点,线程 B 监听到变更事件,判断自己是不是最小的节点,如果是则获得锁。
实现对比
ZooKeeper 具备高可用、可重入、阻塞锁特性,可解决失效死锁问题。 但 ZooKeeper 因为需要频繁的创建和删除节点,性能上不如 Redis 方式。
网友评论