美文网首页
Redis 如何实现分布式锁?ZooKeeper 如何实现分布式

Redis 如何实现分布式锁?ZooKeeper 如何实现分布式

作者: 阔阔飞翔 | 来源:发表于2019-12-30 16:50 被阅读0次

    Redis 如何实现分布式锁?ZooKeeper 如何实现分布式锁?比较二者优劣?

    分布式锁的三种实现:

    基于数据库实现分布式锁;

    基于缓存(Redis 等)实现分布式锁;

    基于 Zookeeper 实现分布式锁;

    数据库实现

    Redis 实现

    获取锁的时候,使用 setnx 加锁,并使用 expire 命令为锁添加一个超时时间,超过该时间则自动释放锁,锁的 value 值为一个随机生成的 UUID,通过此在释放锁的时候进行判断。

    获取锁的时候还设置一个获取的超时时间,若超过这个时间则放弃获取锁。

    释放锁的时候,通过 UUID 判断是不是该锁,若是该锁,则执行 delete 进行锁释放。

    ZooKeeper 实现

    创建一个目录 mylock;

    线程 A 想获取锁就在 mylock 目录下创建临时顺序节点;

    获取 mylock 目录下所有的子节点,然后获取比自己小的兄弟节点,如果不存在,则说明当前线程顺序号最小,获得锁;

    线程 B 获取所有节点,判断自己不是最小节点,设置监听比自己次小的节点;

    线程 A 处理完,删除自己的节点,线程 B 监听到变更事件,判断自己是不是最小的节点,如果是则获得锁。

    实现对比

    ZooKeeper 具备高可用、可重入、阻塞锁特性,可解决失效死锁问题。 但 ZooKeeper 因为需要频繁的创建和删除节点,性能上不如 Redis 方式。

    相关文章

      网友评论

          本文标题:Redis 如何实现分布式锁?ZooKeeper 如何实现分布式

          本文链接:https://www.haomeiwen.com/subject/cdpmoctx.html