Redis和Zookeeper分布式锁对比

本文对比了Redis和Zookeeper实现分布式锁的方法。Redis利用setnx保证原子性,但高并发下可能导致线程自旋占用CPU;Zookeeper通过创建临时顺序节点并监听,避免线程自旋,但实现相对复杂。
摘要由CSDN通过智能技术生成

1、redis实现

在 JUC 包中除了阻塞锁外还有一种叫 CAS 的无阻塞锁,CAS 操作本身是原子性的,多个线程操作同一个变量的 CAS 时候只有一个线程能进行 CAS 成功,失败的线程接下来那么使用乐观锁机制直接失败要么使用自旋方式使用 CPU 资源重复进行 CAS 尝试。

那么在分布式锁的实现中我们也可以使用类似的方式,比如 Redis 提供了一个保证原子性的 setnx 函数,多个线程调用该函数操作同一个 key 的时候,只有一个线程会返回 OK,其他线程返回 null,那么多个 JVM 中的线程同时设置同一个 key 时候只有一个 JVM 里面的一个线程可以返回 OK,返回 OK 的线程就相当于获取了全局锁,返回 null 的线程则可以选择自旋重试。获取到锁的线程使用完毕后调用 del 函数删除对应的 key,然后自旋的线程就会有一个返回 OK…
 

2、zookeeper实现

在 ZK 中是使用文件目录的格式存放节点内容,其中节点类型分为:

持久节点(PERSISTENT ):节点创建后,一直存在,直到主动删除了该节点。
临时节点(EPHEMERAL):生命周期和客户端会话绑定,一旦客户端会话失效,这个节点就会自动删除。
序列节点(SEQUENTIAL ):多个线程创建同一个顺序节点时候,每个线程会得到一个带有编号的节点,节点编号是递增不重复

创建临时顺序节点(EPHEMERAL_SEQUENTIAL),这里我们就使用临时顺序节点来实现分布式锁。
分布式锁实现步骤,每个想要获取锁的线程都要执行下面步骤:

创建临时顺序节点,比如 /loc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值