客户端以前缀 /etcd/lock/ 读取 key-Value 列表,判断自己 key 的 Revision 是否为当前列表中 最小的,如果是则认为获得锁;否则监听列表中前一个 Revision 比自己小的 key 的删除事件,一旦监听到删除事件或者因租约失效而删除的事件,则自己获得锁;
- 执行业务
获得锁后,操作共享资源,执行业务代码
- 释放锁
完成业务流程后,删除对应的key释放锁
肝代码
有了以上理论做基础,我们开始etcd分布式锁的代码实现。
jetcd客户端
jetcd是etcd的Java客户端,它提供了丰富的接口来操作etcd,使用方便。
redis数据准备
初始化库存stock=300,再设置一个lucky=0,表示抢到库存的人,实际场景中可以是用户订单信息,每扣减一个库存,lucky便加1。
etcd分布式锁的实现
由于etcd的Lock接口有一套自己的实现,zookeeper的Lock接口也有自己的一套实现,redis…各种分布式锁实现方案都有自己的Lock,因此,我封装了一个模板方法:
/**
* @program: distributed-lock
* @description: 各种分布式锁的基类,模板方法
* @author: 行百里者
* @create: 2020/10/14 12:29
**/
public class AbstractLock implements Lock {
@Override
public void l