分布式共享锁

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,182元/月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
简介: 11.1 需求描述在我们自己的分布式业务系统中,可能会存在某种资源,需要被整个系统的各台服务器共享访问,但是只允许一台服务器同时访问 11.2 设计思路  11.3 代码开发 public class DistributedClientMy {      // 超时时间      private static

11.1 需求描述

在我们自己的分布式业务系统中,可能会存在某种资源,需要被整个系统的各台服务器共享访问,但是只允许一台服务器同时访问

 

11.2 设计思路

 

11.3 代码开发

 

public class DistributedClientMy {

     // 超时时间

     private static final int SESSION_TIMEOUT = 5000;

     // zookeeper server列表

     private String hosts = "spark01:2181,spark02:2181,spark03:2181";

     private String groupNode = "locks";

     private String subNode = "sub";

     private boolean haveLock = false;

 

     private ZooKeeper zk;

     // 当前client创建的子节点

     private volatile String thisPath;

 

     /**

      * 连接zookeeper

      */

     public void connectZookeeper() throws Exception {

          zk = new ZooKeeper("spark01:2181", SESSION_TIMEOUT, new Watcher() {

               public void process(WatchedEvent event) {

                    try {

 

                         // 子节点发生变化

                         if (event.getType() == EventType.NodeChildrenChanged && event.getPath().equals("/" + groupNode)) {

                              // thisPath是否是列表中的最小节点

                              List<String> childrenNodes = zk.getChildren("/" + groupNode, true);

                              String thisNode = thisPath.substring(("/" + groupNode + "/").length());

                              // 排序

                              Collections.sort(childrenNodes);

                              if (childrenNodes.indexOf(thisNode) == 0) {

                                   doSomething();

                                   thisPath = zk.create("/" + groupNode + "/" + subNode, null, Ids.OPEN_ACL_UNSAFE,

                                             CreateMode.EPHEMERAL_SEQUENTIAL);

                              }

                         }

                    } catch (Exception e) {

                         e.printStackTrace();

                    }

               }

          });

 

          // 创建子节点

          thisPath = zk.create("/" + groupNode + "/" + subNode, null, Ids.OPEN_ACL_UNSAFE,

                    CreateMode.EPHEMERAL_SEQUENTIAL);

 

          // wait一小会, 让结果更清晰一些

          Thread.sleep(new Random().nextInt(1000));

 

          // 监听子节点的变化

          List<String> childrenNodes = zk.getChildren("/" + groupNode, true);

 

          // 列表中只有一个子节点, 那肯定就是thisPath, 说明client获得锁

          if (childrenNodes.size() == 1) {

               doSomething();

               thisPath = zk.create("/" + groupNode + "/" + subNode, null, Ids.OPEN_ACL_UNSAFE,

                         CreateMode.EPHEMERAL_SEQUENTIAL);

          }

     }

 

     /**

      * 共享资源的访问逻辑写在这个方法中

      */

     private void doSomething() throws Exception {

          try {

               System.out.println("gain lock: " + thisPath);

               Thread.sleep(2000);

               // do something

          } finally {

               System.out.println("finished: " + thisPath);

               // 将thisPath删除, 监听thisPath的client将获得通知

               // 相当于释放锁

               zk.delete(this.thisPath, -1);

          }

     }

 

     public static void main(String[] args) throws Exception {

          DistributedClientMy dl = new DistributedClientMy();

          dl.connectZookeeper();

          Thread.sleep(Long.MAX_VALUE);

     }

 

    

}

目录
相关文章
|
监控 安全 Apache
Apache ZooKeeper - 使用ZK实现分布式锁(非公平锁/公平锁/共享锁 )
Apache ZooKeeper - 使用ZK实现分布式锁(非公平锁/公平锁/共享锁 )
774 1
zookeeper实现分布式共享锁
zookeeper实现分布式共享锁
212 0
|
3月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
317 2
|
3月前
|
存储 缓存 NoSQL
【📕分布式锁通关指南 12】源码剖析redisson如何利用Redis数据结构实现Semaphore和CountDownLatch
本文解析 Redisson 如何通过 Redis 实现分布式信号量(RSemaphore)与倒数闩(RCountDownLatch),利用 Lua 脚本与原子操作保障分布式环境下的同步控制,帮助开发者更好地理解其原理与应用。
253 6
|
4月前
|
存储 缓存 NoSQL
Redis核心数据结构与分布式锁实现详解
Redis 是高性能键值数据库,支持多种数据结构,如字符串、列表、集合、哈希、有序集合等,广泛用于缓存、消息队列和实时数据处理。本文详解其核心数据结构及分布式锁实现,帮助开发者提升系统性能与并发控制能力。
|
8月前
|
数据采集 存储 数据可视化
分布式爬虫框架Scrapy-Redis实战指南
本文介绍如何使用Scrapy-Redis构建分布式爬虫系统,采集携程平台上热门城市的酒店价格与评价信息。通过代理IP、Cookie和User-Agent设置规避反爬策略,实现高效数据抓取。结合价格动态趋势分析,助力酒店业优化市场策略、提升服务质量。技术架构涵盖Scrapy-Redis核心调度、代理中间件及数据解析存储,提供完整的技术路线图与代码示例。
862 0
分布式爬虫框架Scrapy-Redis实战指南
|
2月前
|
NoSQL Java 调度
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
分布式锁是分布式系统中用于同步多节点访问共享资源的机制,防止并发操作带来的冲突。本文介绍了基于Spring Boot和Redis实现分布式锁的技术方案,涵盖锁的获取与释放、Redis配置、服务调度及多实例运行等内容,通过Docker Compose搭建环境,验证了锁的有效性与互斥特性。
205 0
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
|
2月前
|
缓存 NoSQL 关系型数据库
Redis缓存和分布式锁
Redis 是一种高性能的键值存储系统,广泛用于缓存、消息队列和内存数据库。其典型应用包括缓解关系型数据库压力,通过缓存热点数据提高查询效率,支持高并发访问。此外,Redis 还可用于实现分布式锁,解决分布式系统中的资源竞争问题。文章还探讨了缓存的更新策略、缓存穿透与雪崩的解决方案,以及 Redlock 算法等关键技术。

热门文章

最新文章

下一篇
oss云网关配置