# elegentlock **Repository Path**: elegentcode/elegentlock ## Basic Information - **Project Name**: elegentlock - **Description**: 这是一个基于springboot的优雅的分布式锁组件。使用这个组件可以让你更轻松、更优雅地在项目中集成分布式锁,让你更专注业务代码的开发。它目前支持redis分布式锁和consul分布式锁两种实现方式,可以通过更改配置自由切换而不需要更改业务代码。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2022-10-28 - **Last Updated**: 2023-06-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ![](doc/images/logob.png) # ElegentLock【分布式锁组件】 #### 介绍 这是一个基于springboot的优雅的分布式锁组件。使用这个组件可以让你更轻松、更优雅地在项目中集成分布式锁,让你更专注业务代码的开发。它目前支持redis分布式锁、redis红锁、consul分布式锁三种实现方式,可以通过更改配置自由切换而不需要更改业务代码。 #### 软件架构 系统采用适配器设计模式,创建了一个顶级接口ELegentLock,我们在项目中只需要注入改接口即可。ELegentLock有多个实现类,对应不同的分布式锁解决方案,用户可以通过配置文件自由切换。 ![](doc/images/lock2.png) #### 使用说明 ##### 准备工作 1.在项目中引入依赖 ```xml cn.elegent elegent-lock 1.1.0 ``` 2.在项目配置文件添加配置,示例如下: ```yaml elegent: lock: type: redis host: 127.0.0.1 port: 6379 ttl: 60 wait: 10 renewal: true ``` 配置说明: (1)type: 分布式锁类型,可选值:consul、redis、redlock,默认值是redis。 (2)host: 分布式锁中间件的部署地址,默认值为127.0.0.1。(类型为redlock此值无效) (3)port: 分布式锁中间件的端口,如果type为redis默认值6379,如果type为consul默认值8500。 (4)ttl: 分布式锁过期时间,单位秒,默认值60。 (5)wait: 等待超时时间,单位秒,默认值10。表示在获取不到锁的时候会在此时间内会进行重试。 (6)renewal:是否续期,默认值false。如果选择续期,则ttl值失效,分布式锁在到期前会自动续期。 (7)address: 地址列表。(类型为redlock此值生效) 示例如下: ``` 192.168.200.128:6379,127.0.0.1:6379,127.0.0.1:6380 ``` redlock(红锁)可以解决redis锁脑裂的问题,建议配置3和或5个节点。 ##### 加锁与释放锁 我们有两种方式实现分布式锁的加锁与释放锁,一种是代码方式实现,一种是注解方式实现。 ###### 代码方式 类中引入ELegentLock ```java @Autowired private ELegentLock eLegentLock; ``` 方法调用以下方法实现加锁与释放锁 ```java eLegentLock.tryLock(锁名字);//加锁,成功返回true,如果锁已经被占用则返回false eLegentLock.lock(锁名字);//加锁,如果锁被占用会通过自旋方式不断尝试,直到加成功为止。 eLegentLock.unLock(锁名字);//释放锁 ``` ###### 注解方式 在方法上添加注解`@ELegentLock(lockName = "test",always = true)` 即可。 `lockName`为锁名字,实际加锁会以`lockName`+方法参数作为锁key。 `always =true`,加锁,如果锁被占用会通过自旋方式不断尝试,直到加成功为止。 `always =false`,(默认值)加锁,只尝试一次。推荐使用此选项。 #### 参与贡献 1. 从 `master` 分支 `checkout` 一个新分支(**注**:*请务必保证 master 代码是最新的*) 2. 新分支命名格式:`docs/username_description`,例如:`docs/tom_新增分布式锁配置项` 3. 在新分支上编辑文档、代码,并提交代码 4. 最后 `PR` 合并到 `develop` 分支,等待作者合并即可