前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >zookeeper分布式锁

zookeeper分布式锁

作者头像
张云飞Vir
发布2022-09-29 12:23:57
1930
发布2022-09-29 12:23:57
举报
文章被收录于专栏:写代码和思考写代码和思考

场景

“分布式锁”是用来解决分布式应用中“并发冲突”的一种常用手段,实现方式一般有基于zookeeper及基于redis二种

使用基于zookeeper的分布式锁

所需组件:

  • zookeeper服务
  • Curator 客户端

启动zookeeper

一般是集群部署,启动zookeeper服务端。

java 代码

Curator 是一个 基于 zookeeper服务 的客户端工具

curator提供了InterProcessMutex 这样一个api。除了分布式锁之外,还提供了leader选举、分布式队列等常用的功能。 InterProcessMutex:分布式可重入排它锁 InterProcessSemaphoreMutex:分布式排它锁 InterProcessReadWriteLock:分布式读写锁

引入依赖:

代码语言:javascript
复制
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>5.2.0</version>
</dependency>

<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>5.2.0</version>
</dependency>

初始化会话连接:

代码语言:javascript
复制
@Bean
CuratorFramework CuratorFramework() {
    CuratorFramework curatorFramework = CuratorFrameworkFactory.builder()
            .connectString("192.168.1.111:2181")
            .sessionTimeoutMs(15000)
            .connectionTimeoutMs(20000)
            .retryPolicy(new ExponentialBackoffRetry(1000, 10))
            .build();

    //打开连接
    curatorFramework.start();
    //是否成功建立连接,true :建立, false:没有建立
    System.out.println("是否打开:"+curatorFramework.isStarted());
    return curatorFramework;

主要方法:

InterProcessMutex lock = new InterProcessMutex(curatorFramework, "/LOCK_LOCK_2"); lock.acquire();//抢占分布式锁资源(阻塞的) lock.release();

示例:

代码语言:javascript
复制
// 引入Zookeeper实现分布式锁 ,curator客户端
    private synchronized String impl08() throws Exception {
        System.out.println("基于临时有序节点来实现的分布式锁 的实现");
        // 基于临时有序节点来实现的分布式锁.
        InterProcessMutex lock = new InterProcessMutex(curatorFramework, "/LOCK_LOCK_2");
        try {
            lock.acquire();//抢占分布式锁资源(阻塞的)

            //----------------------
            String res = "";
            String stockStr = stringRedisTemplate.opsForValue().get("stock");
            if (StringUtils.isEmpty(stockStr)) return "库存为空";
            int stock = Integer.parseInt(stockStr);
            if (stock > 0) {
                int newStock = stock - 1;
                stringRedisTemplate.opsForValue().set("stock", newStock + "");
                res = String.format("扣减成功 from %s to %s \n", stock, newStock);
                System.out.println(res);
            } else {
                res = String.format("扣减失败 from %s \n", stock);
                System.out.println(res);
            }
            return res;
        } finally {
            // 完事后释放 锁
            lock.release();
        }
    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-09-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 场景
  • 使用基于zookeeper的分布式锁
    • 启动zookeeper
      • java 代码
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档