ZooLock 基于zookeeper的分布式锁

技术文档网 2021-06-22

ZooLock 基于zookeeper的分布式锁

这个注解作用于方法,让方法在分布式系统中拥有分布式锁的能力,当然也可以用于单体服务当普通锁用(不推荐)。 使用也非常简单,我们来看一个最简单的例子,在写例子之前我们需要在application.properties配置文件中配置一些参数

# 基于zookeeper分布式锁配置
# 要使用分布式锁,必须设置为true
zk.lock.enabled=true
zk.lock.url=127.0.0.1:2181
# 重试次数,默认3
zk.lock.retry=3
# 超时时间(毫秒)
zk.lock.timeout=1000

配置完成我们来看看简单使用此注解的例子:

/**
 * 通过设置分布式锁,使得方法具有分布式锁的能力
 * <p>分布式锁key:/DISTRIBUTED_LOCK_books</p>
 * @return
 * @throws InterruptedException
 */
@ZooLock(key = "books")
@RequestMapping(value = "/selectByExample", method = RequestMethod.POST)
public MessageResult selectByExample() throws InterruptedException {
    BaikeExample example = new BaikeExample();
    BaikeExample.Criteria criteria = example.createCriteria();

    criteria.andNameEqualTo("海明威");
    List<Baike> hBaikes = baikeService.selectByExample(example);
    List<Baike> allBooks = new ArrayList<>(hBaikes);

    Thread.sleep(6000);

    return MessageResult.ok(allBooks);
}

默认如果没有设置,锁释放时间,默认五秒,我们延时是六秒钟,此时如果有两个请求过来,我们就会发现一个返回结果,一个如下图所示

接一下我们看一个比较复杂的例子,可以生成分布式锁动态key

/**
 * 通过@LockKeyParam 实现分布式锁动态key,如果对象中的id和book分别为 1 和 全职法师
 * <p>分布式锁key:/DISTRIBUTED_LOCK_books/1/全职法师</p>
 * @param baike 前端传入对象参数
 * @return
 * @throws InterruptedException
 */
@ZooLock(key = "books", timeout = 3000L)
@RequestMapping(value = "/getBaikes", method = RequestMethod.POST)
public MessageResult getBaikes(@LockKeyParam(fields = {"id","book"}) Baike baike) throws InterruptedException {
    System.out.println("我进来啦!!!");
    Thread.sleep(5000);
    System.out.println("我出来啦!!!");

    return MessageResult.ok(baike);
}

在我们Baike的对象中包含id和book属性,通过@LockKeyParam注解就可以把这两个属性动态添加到key中,实现我们自定义key的操作。

当然我们使用@LockKeyParam注解不一定要在对象中,普通参数属性也可以,例如:

/**
 * 通过@LockKeyParam 实现分布式锁动态key,如果参数name为 全职法师
 * <p>分布式锁key:/DISTRIBUTED_LOCK_books/全职法师</p>
 * @param name 前端书名参数
 * @return
 * @throws InterruptedException
 */
@ZooLock(key = "books", timeout = 3000L)
@RequestMapping(value = "/getBaikeName", method = RequestMethod.POST)
public MessageResult getBaikes(@LockKeyParam String name) throws InterruptedException {
    System.out.println("我进来啦!!!");
    Thread.sleep(5000);
    System.out.println("我出来啦!!!");

    return MessageResult.ok(name);
}

是不是很简单,赶紧去试试吧

相关文章

  1. 硅谷互联网公司的开发流程

    开发流程包括这么几个阶段: OKR 的设立; 主项目及其子项目的确立; 每个子项目的生命周期; 主项目的生命周期; 收尾、维护、复盘。 第一点,OKR 的设立 所有项目的起始,都应该从 Ro

  2. RESTful-表述性状态转移风格

    REST英文全拼:Representational State Transfer 面向资源编程 资源指的就是一类数据 产品表-&gt;就是产品资源 最重要的是如何表示一个资源 地址即

  3. 稳定性思考

    产品功能线 0-1: 当系统从无到有的时候,首要考虑的是研发效率,功能快速迭代,满足快速增长的业务需求 1-10 系统已经搭建起来,此时考虑的是系统的稳定性。 可用性:1.隔离:区分出核心和非核心功能

  4. Supervisor守护队列发邮件

    安装 CentOS: yum -y install supervisor Debien/Ubuntu适用:apt-get install supervisor 配置 修改主配置文件:vim /et

  5. 安装libsodium,让服务器支持chacha20等加密方式

    用chacha20加密方式需要安装libsodium 注意:libsodium从1.0.15开始就废弃了aes-128-ctr yum install wget m2crypto git libsod

随机推荐

  1. 硅谷互联网公司的开发流程

    开发流程包括这么几个阶段: OKR 的设立; 主项目及其子项目的确立; 每个子项目的生命周期; 主项目的生命周期; 收尾、维护、复盘。 第一点,OKR 的设立 所有项目的起始,都应该从 Ro

  2. RESTful-表述性状态转移风格

    REST英文全拼:Representational State Transfer 面向资源编程 资源指的就是一类数据 产品表-&gt;就是产品资源 最重要的是如何表示一个资源 地址即

  3. 稳定性思考

    产品功能线 0-1: 当系统从无到有的时候,首要考虑的是研发效率,功能快速迭代,满足快速增长的业务需求 1-10 系统已经搭建起来,此时考虑的是系统的稳定性。 可用性:1.隔离:区分出核心和非核心功能

  4. Supervisor守护队列发邮件

    安装 CentOS: yum -y install supervisor Debien/Ubuntu适用:apt-get install supervisor 配置 修改主配置文件:vim /et

  5. 安装libsodium,让服务器支持chacha20等加密方式

    用chacha20加密方式需要安装libsodium 注意:libsodium从1.0.15开始就废弃了aes-128-ctr yum install wget m2crypto git libsod