distributed-lock-core

This is an extension library to the lock impl. 这是分布式锁实现封装的扩展库。 项目地址:https://github.com/zhuobinchan/distributed-lock

License

License

GroupId

GroupId

com.github.zhuobinchan
ArtifactId

ArtifactId

distributed-lock-core
Last Version

Last Version

2.1
Release Date

Release Date

Type

Type

jar
Description

Description

distributed-lock-core
This is an extension library to the lock impl. 这是分布式锁实现封装的扩展库。 项目地址:https://github.com/zhuobinchan/distributed-lock
Project URL

Project URL

https://github.com/zhuobinchan/distributed-lock
Source Code Management

Source Code Management

https://github.com/zhuobinchan/distributed-lock

Download distributed-lock-core

How to add to project

<!-- https://jarcasting.com/artifacts/com.github.zhuobinchan/distributed-lock-core/ -->
<dependency>
    <groupId>com.github.zhuobinchan</groupId>
    <artifactId>distributed-lock-core</artifactId>
    <version>2.1</version>
</dependency>
// https://jarcasting.com/artifacts/com.github.zhuobinchan/distributed-lock-core/
implementation 'com.github.zhuobinchan:distributed-lock-core:2.1'
// https://jarcasting.com/artifacts/com.github.zhuobinchan/distributed-lock-core/
implementation ("com.github.zhuobinchan:distributed-lock-core:2.1")
'com.github.zhuobinchan:distributed-lock-core:jar:2.1'
<dependency org="com.github.zhuobinchan" name="distributed-lock-core" rev="2.1">
  <artifact name="distributed-lock-core" type="jar" />
</dependency>
@Grapes(
@Grab(group='com.github.zhuobinchan', module='distributed-lock-core', version='2.1')
)
libraryDependencies += "com.github.zhuobinchan" % "distributed-lock-core" % "2.1"
[com.github.zhuobinchan/distributed-lock-core "2.1"]

Dependencies

compile (2)

Group / Artifact Type Version
org.redisson : redisson jar 3.14.0
org.apache.curator : curator-recipes jar 5.0.0

test (1)

Group / Artifact Type Version
org.junit.jupiter : junit-jupiter jar 5.6.2

Project Modules

There are no modules declared in this project.

distributed-lock

非spring boot 整合例子

1、添加jar包引入

<dependency>
    <groupId>com.github.zhuobinchan</groupId>
    <artifactId>distributed-lock-core</artifactId>
    <version>2.1</version>
</dependency>

2、使用示例:

public class DistributedLockTestCase {

    //Redisson 方式实现分布式锁
    @Test
    public void testSingleRedisLock(){
        RedissonConfig redissonConfig = new RedissonConfig();
        redissonConfig.setAddress("redis://127.0.0.1:6379");

        RedissonDistributedLockTemplate redissonDistributedLockTemplate = new RedissonDistributedLockTemplate();
        redissonDistributedLockTemplate.setRedissonConfig(redissonConfig);
        redissonDistributedLockTemplate.setDistributedLockConfig(new DistributedLockConfig());

        ((DistributedLockTemplate) redissonDistributedLockTemplate).lock("test",()->"test-a");

    }

    //Zookeeper 方式实现分布式锁
    @Test
    public void testSingleZookeeperLock(){
        ZookeeperConfig zookeeperConfig = new ZookeeperConfig();
        zookeeperConfig.setConnectString("127.0.0.1:2181");

        ZookeeperDistributedLockTemplate zookeeperDistributedLockTemplate = new ZookeeperDistributedLockTemplate();
        zookeeperDistributedLockTemplate.setZookeeperConfig(zookeeperConfig);
        zookeeperDistributedLockTemplate.setDistributedLockConfig(new DistributedLockConfig());

        ((DistributedLockTemplate) zookeeperDistributedLockTemplate).lock("test",()->"test-a");

    }
}

distributed-lock

非spring boot 整合例子

1、添加jar包引入

<dependency>
    <groupId>com.github.zhuobinchan</groupId>
    <artifactId>distributed-lock-core</artifactId>
    <version>2.1</version>
</dependency>

2、使用示例:

public class DistributedLockTestCase {

    //Redisson 方式实现分布式锁
    @Test
    public void testSingleRedisLock(){
        RedissonConfig redissonConfig = new RedissonConfig();
        redissonConfig.setAddress("redis://127.0.0.1:6379");

        RedissonDistributedLockTemplate redissonDistributedLockTemplate = new RedissonDistributedLockTemplate();
        redissonDistributedLockTemplate.setRedissonConfig(redissonConfig);
        redissonDistributedLockTemplate.setDistributedLockConfig(new DistributedLockConfig());

        ((DistributedLockTemplate) redissonDistributedLockTemplate).lock("test",()->"test-a");

    }

    //Zookeeper 方式实现分布式锁
    @Test
    public void testSingleZookeeperLock(){
        ZookeeperConfig zookeeperConfig = new ZookeeperConfig();
        zookeeperConfig.setConnectString("127.0.0.1:2181");

        ZookeeperDistributedLockTemplate zookeeperDistributedLockTemplate = new ZookeeperDistributedLockTemplate();
        zookeeperDistributedLockTemplate.setZookeeperConfig(zookeeperConfig);
        zookeeperDistributedLockTemplate.setDistributedLockConfig(new DistributedLockConfig());

        ((DistributedLockTemplate) zookeeperDistributedLockTemplate).lock("test",()->"test-a");

    }
}

spring boot 整合例子

第1步: maven添加配置文件

<dependency>
	<groupId>>com.github.zhuobinchan</groupId>
	<artifactId>distributed-lock-spring-boot-starter</artifactId>
    <version>2.1</version>
</dependency>

第2步: 在application启动类上添加对应的注解@EnableDistributedLock

@EnableDistributedLock
@SpringBootApplication
public class DistributedLockSpringBootDemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DistributedLockSpringBootDemoApplication.class, args);
	}

}

第3步:在对应配置文件上添加对应的配置

以Redisson作为分布式锁

spring.distributed.lock.enable=true

# redisson方式实现分布式锁
spring.distributed.lock.lock-type=redisson
spring.distributed.lock.redisson-config.address=redis://127.0.0.1:6379

以Zookeeper作为分布式锁

spring.distributed.lock.enable=true

# zookeeper方式实现分布式锁
spring.distributed.lock.lock-type=zookeeper
spring.distributed.lock.zookeeper-config.connect-string=127.0.0.1:2181

第4步: 可以用以下集中方式使用分布式锁

使用方式一: 注入方式使用即可

@SpringBootTest
@RunWith(SpringRunner.class)
class DistributedLockSpringBootDemoApplicationTests {

	@Autowired
	private DistributedLockTemplate template;

	@Test
	void contextLoads() {
		template.lock("test",()->"test-a");
	}

}

使用方式二: 静态类调用方式:

@SpringBootTest
@RunWith(SpringRunner.class)
class DistributedLockSpringBootDemoApplicationTests {
    @Test
    void templateUtilsTest() {
        DistributedLockTemplateUtils.lock("test", () -> "test-a");
    }
}

使用方式三: 需要使用由spring进行管理,因为是通过spring的aop进行实现,用法和cache的注解类似

@Service
public class DistributedLockServiceImpl implements DistributedLockService {

    @Override
    @DistributedLock(key = "testKey1")
    public String testLockByAnnotation() {
        return "testKey1";
    }

    @Override
    @DistributedLock(key = "lockKey1")
    public String testLockByAnnotationWithArg(String lockKey1) {
        return "testKey1";
    }

    @Override
    @DistributedLock(key = "#lockKey1")
    public String testLockByAnnotation(String lockKey1) {
        return "lockKey1";
    }

    @Override
    @DistributedLock(key = "#testLockView.lockKey2")
    public String testLockByAnnotation(TestLockView testLockView) {
        return "testLockView";
    }
}

将会支持列表

序号 功能列表 是否支持
1 支持redission实现发布锁 支持
2 支持zookeeper实现发布锁 支持
3 补充测试用例 未来支持
4 集群模式的分布式锁实现 未来支持

核心方法参数说明

非spring boot方式核心类 方法解释

public interface DistributedLockTemplate {

   /**
    * 直接上锁
    * @param lockKey 锁键
    * @param callback 需要锁的区域逻辑代码实现
    * @param <V> 返回值泛型
    * @return 区域逻辑代码执行返回值
    */
   <V> V lock(String lockKey, DistributedLockCallable<V> callback);

   /**
    * 直接上锁
    * @param lockKey 锁键
    * @param callback 需要锁的区域逻辑代码实现
    * @param fairLock 是否公平锁
    * @param <V> 返回值泛型
    * @return 区域逻辑代码执行返回值
    */
   <V> V lock(String lockKey, DistributedLockCallable<V> callback, boolean fairLock);

   /**
    * 直接上锁
    * @param lockKey 锁键
    * @param callback 需要锁的区域逻辑代码实现
    * @param leaseTime 释放锁时间
    * @param timeUnit 时间单位
    * @param fairLock 是否公平锁
    * @param <V> 返回值泛型
    * @return 区域逻辑代码执行返回值
    */
   <V> V lock(String lockKey, DistributedLockCallable<V> callback, long leaseTime, TimeUnit timeUnit, boolean fairLock);

   /**
    * 尝试上锁
    * @param lockKey 锁键
    * @param callback 需要锁的区域逻辑代码实现
    * @param <V> 返回值泛型
    * @return 区域逻辑代码执行返回值
    */
   <V> V tryLock(String lockKey, DistributedLockCallable<V> callback) throws InterruptedException;

   /**
    * 尝试上锁
    * @param lockKey 锁键
    * @param callback 需要锁的区域逻辑代码实现
    * @param fairLock 是否公平锁
    * @param <V> 返回值泛型
    * @return 区域逻辑代码执行返回值
    */
   <V> V tryLock(String lockKey, DistributedLockCallable<V> callback, boolean fairLock) throws InterruptedException;

   /**
    * 尝试上锁
    * @param lockKey 锁键
    * @param callback 需要锁的区域逻辑代码实现
    * @param waitTime 上锁等待时长
    * @param leaseTime 释放锁时间
    * @param timeUnit 时间单位
    * @param fairLock 是否公平锁
    * @param <V> 返回值泛型
    * @return 区域逻辑代码执行返回值
    */
   <V> V tryLock(String lockKey, DistributedLockCallable<V> callback, long waitTime, long leaseTime, TimeUnit timeUnit, boolean fairLock) throws InterruptedException;

   /**
    * 通用配置设置
    * @param distributedLockConfig 通用配置
    */
   void setDistributedLockConfig(DistributedLockConfig distributedLockConfig);

   /**
    * 过去通用配置
    * @return 通用配置
    */
   DistributedLockConfig getDistributedLockConfig();
}

spring boot方式核心类 方法解释

DistributedLockTemplate 以及 DistributedLockTemplateUtils 使用方法同上

注解核心使用方法

public @interface DistributedLock {


    /**
     * @return 分布式锁key值,spring el表达式, 参考cache
     */
    String key();

    /**
     * @return 是否从配置文件读取下面字段的数据
     *
     *
     * 包括以下字段:fairLock{@link #fairLock};tryLock{@link #tryLock};waitTime{@link #waitTime};leaseTime{@link #leaseTime};timeUnit{@link #timeUnit};
     */
    boolean readInConfig() default true;

    /**
     * @return 是否使用公平锁。 公平锁即先来先得。
     */
    boolean fairLock() default false;

    /**
     * @return 是否使用尝试锁
     */
    boolean tryLock() default true;

    /**
     * @return 最长等待时间。 该字段只有当tryLock()返回true才有效。
     */
    long waitTime() default 60L;

    /**
     * @return 锁超时时间。 超时时间过后,锁自动释放。 建议: 尽量缩简需要加锁的逻辑。
     */
    long leaseTime() default 20L;

    /**
     * @return 时间单位。默认为秒。
     */
    TimeUnit timeUnit() default TimeUnit.SECONDS;
}

Versions

Version
2.1
2.0
1.0