# distributed-lock **Repository Path**: stevenmaster/distributed-lock ## Basic Information - **Project Name**: distributed-lock - **Description**: 分布式锁 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-07-20 - **Last Updated**: 2025-07-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # distributed-lock #### 介绍 分布式锁工具包,该工具包集成了Zookeeper分布式锁、Redis分布式锁、MySQL分布式锁来方便开发者的使用。 + Zookeeper分布式锁是基于Curator框架的InterProcessMutex来实现的。为了方便对InterProcessMutex原理的理解,在 com.hanxiaozhang.zookeeper.source目录中对主要源码进行了注释。此外,Zookeeper不允许在临时节点下创建子节点, InterProcessMutex会根据加锁时传入path的创建一个持久节点,然后在这个持久节点下创建顺序临时节点。如果,不定期清理, 会导致Zk节点数量将会急速递增,所以该分布式锁工具包会使用一个后台线程定时清理。 + Redis分布式锁是基于Redisson框架的RedissonLock来实现的。为了方便对RedissonLock原理的理解,在 com.hanxiaozhang.redis.source目录中对主要源码进行了注释。此外,根据Redis加锁的原理,Redis分布式锁特别支持: 在加锁以后,在leaseTime之后会自动解锁的操作,具体方法:lock(long leaseTime, TimeUnit unit);尝试加锁, 在加锁成功后,在leaseTime之后自动解锁,具体方法:tryLock(long time, long leaseTime, TimeUnit timeUnit)。 + MySQL分布式锁基于for update排它锁来实现的。但是要注意where xxx for update语句的where条件必须有索引,不然for update 排它锁会从行锁升级为表锁。 #### 软件架构 使用的设计模式: + 抽象类,模板模式、建造模式、工厂模式、单例模式 Springboot starter的设计: + 在Springboot框架下,可以自动获取配置,自动将DistributedLockFactory Bean 加载到Spring容器中 + 在配置文件中,使用自定义转换器,处理Spring不能默认转换的属性 #### 安装教程 1. 从Gitee仓库克隆代码到本地: ``` git clone https://gitee.com/hanxiaozhang2018/distributed-lock.git ``` 2. 使用Maven工具对代码进行打包: ``` mvn install ``` 3. 项目在pom.xml文件中引入依赖: ``` com.hanxiaozhang distributed-lock 1.0.0 ``` 4. Springboot项目的读入配置: 该分布式锁工具包在Springboot的概念中是一个Starter,所以它支持配置自动注入。现在只需要在 application.yml文件中配置相关参数,或者使用默认参数即可构建DistributedLockFactory。 application.yml配置如下: ``` distributedLock: enabled: true zkAddress: 127.0.0.1:2181 zkLockPathPrefix: /zk-lock zkLockProjectPath: /test zkClearInvalidNode: true redisModel: single redisAddress: 127.0.0.1:6379 redisPassword: 123456 redisDb: 0 ``` 5. 普通项目读入配置: 使用DistributedLockFactoryBuilder来构建DistributedLockFactory。具体使用如下: ``` DistributedLockFactory factory = DistributedLockFactoryBuilder().build("hanxiaozhang.yml",distributedLock"); ``` **Tips:** **hanxiaozhang.yml文件必须在引用该分布式工具包项目的resources目录下** #### 使用说明 使用方法很简单,直接从DistributedLockFactory获取相应的锁,举例使用Redis分布式锁: ``` DistributedLock lock = factory.getRedisLock("lockKey"); lock.lock(); try{ ... ... }catch (Exception e){ ... ... } finally { lock.unlock(); } ``` #### 问题 1.全面测试与压测 + #### 待处理问题 1. MySQL 分布式锁 2. Redis 分布式锁,打算直接集成Redisson 已处理 3. 源码替换,debug走一遍 #### 想法 1. 使用建造者模式构建分布式锁工厂,使用分布式工厂创建不同类型的分布式锁(redis锁、zk锁) 2. 改成springboot starter 3. 添加断言的使用 4. 连接zk、redis使用单例,节约内存、节约连接连接数 5. zk不允许在临时节点下创建子节点,InterProcessMutex工具类会根据加锁时,传入path的创建一个持久节点,然后在这个持久节点下创建顺序临时节点。如果, 不定期清理,就会导致Zk节点数量将会急速递增。-> 使用后台线程清理