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

2019-12-30  本文已影响0人  阔阔飞翔

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

分布式锁的三种实现:

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

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

基于 Zookeeper 实现分布式锁;

数据库实现

Redis 实现

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

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

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

ZooKeeper 实现

创建一个目录 mylock;

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

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

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

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

实现对比

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

上一篇下一篇

猜你喜欢

热点阅读