# easy-lock **Repository Path**: trf/easy-lock ## Basic Information - **Project Name**: easy-lock - **Description**: 高性能分布式锁,开箱即用,不侵入任何业务,一个注解解决所有后顾之忧,支持SpEl表达式 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: https://gitee.com/lilu777/easy-lock - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-03-08 - **Last Updated**: 2023-03-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 简介 --- - **基于redisson的注解式的高性能多模式分布式锁** - **支持集群** - **除注解外额外提供显式的分布式锁声明方式** - **支持SpEl表达式** - **官网地址[Easy-Lock](http://org.ankao.net)** - **后续版本会陆续增加其他实现方式:** 如 zookeeper、mysql等 # 优点 --- - **降低开发者门槛:** 开发者只需要会SpringBoot - **减少开发成本:** 不需要关心锁的获取和释放 - **代码量极少:** 一个注解解决所有 - **多模式:** 阻塞式、非阻塞式、公平锁、非公平锁、独占锁、共享锁、可重入 - **...** # @EasyLock 参数详解 --- - **value** 锁的名称。(支持 SpEl 表达式) - **fairLock** 是否使用公平锁 - **tryLock** 是否使用尝试锁 - **waitTime** 最长等待时间,该字段只有当tryLock()返回true才有效。 - **leaseTime** 锁超时时间。 可填-1 - **timeUnit** 时间单位。默认为秒 - **condition** 拥有条件/限制条件,只有为 true 才执行加锁逻辑。(支持 SpEL 表达式) # SpEL 语法概要 --- - **argument name** 方法参数的名字,可以直接#参数名,也可以使用#p0或#a0的形式,0代表参数的索引。例如:#xyz、#p0、#a1 - **methodName** 当前被调用的方法名。例如:#root.methodName - **method** 当前被调用的方法。例如:#root.method.name - **args** 当前被调用的方法的参数列表。例如:#root.args[0] - **target** 当前被调用的目标对象。例如:#root.target - **targetClass** 当前被调用的目标对象类。例如:#root.targetClass # 项目模块 --- - **easy-lock-spring-boot-starter:** 核心包 - **spring-boot-demo:** demo包 # Demo --- - 基于注解实现 ```java public class DemoServiceImpl { private StringRedisTemplate stringRedisTemplate; @EasyLock(value = "#user.name", waitTime = 2, condition = "#user.sex == '女' ") public Integer happyNewYear(User user) { Integer age = 1; String s = stringRedisTemplate.opsForValue().get(user.getName()); if (StringUtils.hasText(s)) { age += Integer.parseInt(s); } stringRedisTemplate.opsForValue().set(user.getName(), age.toString()); return age; } /** * 缺省不填写 * @param user * @return */ @EasyLock public Integer happyNewYear(User user) { Integer age = 1; String s = stringRedisTemplate.opsForValue().get(user.getName()); if (StringUtils.hasText(s)) { age += Integer.parseInt(s); } stringRedisTemplate.opsForValue().set(user.getName(), age.toString()); return age; } } ``` - 显式的声明 ```java public class Demo { @Test void demo2() throws InterruptedException { User user = new User(); user.setSex("男"); user.setName("easy-demo:" + "小" + (finalI % 2)); try { // 锁 easyLockUtil.tryLock(user.getName(), () -> happyNewYear(user)); } catch (Throwable e) { e.printStackTrace(); } } private Integer happyNewYear(User user) { AtomicReference age = new AtomicReference<>(1); if (stringRedisTemplate.hasKey(user.getName())) { age.updateAndGet(v -> v + Integer.parseInt(stringRedisTemplate.opsForValue().get(user.getName()))); } stringRedisTemplate.opsForValue().set(user.getName(), age.toString()); return age.get(); } } ``` --- **Maven:** ``` xml net.ankao.org easy-lock-spring-boot-starter 0.0.1 ``` # 其他开源项目 --- - [DocSys 分布式文档管理系统](https://gitee.com/RainyGao/DocSys) - [easy-es 更好用的elastic search搜索引擎框架](https://gitee.com/dromara/easy-es) # 期望 --- > 欢迎提出更好的意见,帮助完善 Easy-Lock # 版权 --- [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0) # 捐赠 ---