From 7d9fdbe76a750b6d185ce5912fe32af627c0e084 Mon Sep 17 00:00:00 2001 From: "Yangkai.Shen" <237497819@qq.com> Date: Sat, 3 Sep 2022 02:27:46 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E5=88=86=E5=B8=83=E5=BC=8F?= =?UTF-8?q?=E9=94=81=E6=A8=A1=E5=9D=97=E4=B9=8B=20=E5=9F=BA=E4=BA=8E=20red?= =?UTF-8?q?isson=20=E5=AE=9E=E7=8E=B0=E5=88=86=E5=B8=83=E5=BC=8F=E9=94=81?= =?UTF-8?q?=20=E6=A1=88=E4=BE=8B=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo-distributed-lock-redisson/pom.xml | 21 ++++++++++ .../lock/RedissonDistributedLockApplication.java | 21 ++++++++++ .../autoconfigure/RedissonDistributedLock.java | 48 ++++++++++++++++++++++ .../RedissonDistributedLockAutoConfiguration.java | 31 ++++++++++++++ .../RedissonDistributedLockClient.java | 34 +++++++++++++++ .../src/main/resources/application.yml | 17 ++++++++ 6 files changed, 172 insertions(+) create mode 100644 demo-distributed-lock/demo-distributed-lock-redisson/src/main/java/com/xkcoding/distributed/lock/RedissonDistributedLockApplication.java create mode 100644 demo-distributed-lock/demo-distributed-lock-redisson/src/main/java/com/xkcoding/distributed/lock/autoconfigure/RedissonDistributedLock.java create mode 100644 demo-distributed-lock/demo-distributed-lock-redisson/src/main/java/com/xkcoding/distributed/lock/autoconfigure/RedissonDistributedLockAutoConfiguration.java create mode 100644 demo-distributed-lock/demo-distributed-lock-redisson/src/main/java/com/xkcoding/distributed/lock/autoconfigure/RedissonDistributedLockClient.java create mode 100644 demo-distributed-lock/demo-distributed-lock-redisson/src/main/resources/application.yml diff --git a/demo-distributed-lock/demo-distributed-lock-redisson/pom.xml b/demo-distributed-lock/demo-distributed-lock-redisson/pom.xml index 1a9730a..61095bb 100644 --- a/demo-distributed-lock/demo-distributed-lock-redisson/pom.xml +++ b/demo-distributed-lock/demo-distributed-lock-redisson/pom.xml @@ -14,6 +14,27 @@ 17 + 3.17.6 + + + com.xkcoding + demo-distributed-lock-api + 1.0.0-SNAPSHOT + + + + org.redisson + redisson + ${redisson.version} + + + + org.projectlombok + lombok + true + + + diff --git a/demo-distributed-lock/demo-distributed-lock-redisson/src/main/java/com/xkcoding/distributed/lock/RedissonDistributedLockApplication.java b/demo-distributed-lock/demo-distributed-lock-redisson/src/main/java/com/xkcoding/distributed/lock/RedissonDistributedLockApplication.java new file mode 100644 index 0000000..dde1d38 --- /dev/null +++ b/demo-distributed-lock/demo-distributed-lock-redisson/src/main/java/com/xkcoding/distributed/lock/RedissonDistributedLockApplication.java @@ -0,0 +1,21 @@ +package com.xkcoding.distributed.lock; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + *

+ * 启动器 + *

+ * + * @author yangkai.shen + * @date 2022-09-02 22:34 + */ +@SpringBootApplication +public class RedissonDistributedLockApplication { + + public static void main(String[] args) { + SpringApplication.run(RedissonDistributedLockApplication.class, args); + } + +} diff --git a/demo-distributed-lock/demo-distributed-lock-redisson/src/main/java/com/xkcoding/distributed/lock/autoconfigure/RedissonDistributedLock.java b/demo-distributed-lock/demo-distributed-lock-redisson/src/main/java/com/xkcoding/distributed/lock/autoconfigure/RedissonDistributedLock.java new file mode 100644 index 0000000..cc29755 --- /dev/null +++ b/demo-distributed-lock/demo-distributed-lock-redisson/src/main/java/com/xkcoding/distributed/lock/autoconfigure/RedissonDistributedLock.java @@ -0,0 +1,48 @@ +package com.xkcoding.distributed.lock.autoconfigure; + +import com.xkcoding.distributed.lock.api.DistributedLock; +import org.jetbrains.annotations.NotNull; +import org.redisson.api.RedissonClient; + +import java.util.concurrent.TimeUnit; + +/** + *

+ * Redisson分布式锁实现 + *

+ * + * @author yangkai.shen + * @date 2022-09-03 01:18 + */ +public class RedissonDistributedLock extends DistributedLock { + private final RedissonClient redissonClient; + + protected RedissonDistributedLock(RedissonClient redissonClient, String lockKey, long lockTime, TimeUnit timeUnit) { + super(lockKey, lockTime, timeUnit); + this.redissonClient = redissonClient; + } + + @Override + public void lock() { + redissonClient.getLock(lockKey).lock(); + } + + @Override + public boolean tryLock() { + try { + return tryLock(lockTime, timeUnit); + } catch (InterruptedException e) { + return false; + } + } + + @Override + public boolean tryLock(long time, @NotNull TimeUnit unit) throws InterruptedException { + return redissonClient.getLock(lockKey).tryLock(lockTime, timeUnit); + } + + @Override + public void unlock() { + redissonClient.getLock(lockKey).unlock(); + } +} diff --git a/demo-distributed-lock/demo-distributed-lock-redisson/src/main/java/com/xkcoding/distributed/lock/autoconfigure/RedissonDistributedLockAutoConfiguration.java b/demo-distributed-lock/demo-distributed-lock-redisson/src/main/java/com/xkcoding/distributed/lock/autoconfigure/RedissonDistributedLockAutoConfiguration.java new file mode 100644 index 0000000..3931f60 --- /dev/null +++ b/demo-distributed-lock/demo-distributed-lock-redisson/src/main/java/com/xkcoding/distributed/lock/autoconfigure/RedissonDistributedLockAutoConfiguration.java @@ -0,0 +1,31 @@ +package com.xkcoding.distributed.lock.autoconfigure; + +import org.redisson.Redisson; +import org.redisson.api.RedissonClient; +import org.redisson.config.Config; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + *

+ * 基于Redisson分布式锁自动装配类 + *

+ * + * @author yangkai.shen + * @date 2022-09-03 01:12 + */ +@Configuration(proxyBeanMethods = false) +public class RedissonDistributedLockAutoConfiguration { + + @Bean + public RedissonClient redissonClient() { + Config config = new Config(); + config.useSingleServer().setAddress("redis://127.0.0.1:6379"); + return Redisson.create(config); + } + + @Bean + public RedissonDistributedLockClient distributedLockClient(RedissonClient redissonClient) { + return new RedissonDistributedLockClient(redissonClient); + } +} diff --git a/demo-distributed-lock/demo-distributed-lock-redisson/src/main/java/com/xkcoding/distributed/lock/autoconfigure/RedissonDistributedLockClient.java b/demo-distributed-lock/demo-distributed-lock-redisson/src/main/java/com/xkcoding/distributed/lock/autoconfigure/RedissonDistributedLockClient.java new file mode 100644 index 0000000..79b1249 --- /dev/null +++ b/demo-distributed-lock/demo-distributed-lock-redisson/src/main/java/com/xkcoding/distributed/lock/autoconfigure/RedissonDistributedLockClient.java @@ -0,0 +1,34 @@ +package com.xkcoding.distributed.lock.autoconfigure; + +import com.xkcoding.distributed.lock.api.DistributedLock; +import com.xkcoding.distributed.lock.api.DistributedLockClient; +import lombok.RequiredArgsConstructor; +import org.redisson.api.RedissonClient; + +import java.util.concurrent.TimeUnit; + +/** + *

+ * 获取一把 Redisson 分布式锁 + *

+ * + * @author yangkai.shen + * @date 2022-09-03 01:21 + */ +@RequiredArgsConstructor +public class RedissonDistributedLockClient implements DistributedLockClient { + private final RedissonClient redissonClient; + + /** + * 获取一把锁 + * + * @param lockKey 锁的标识 + * @param lockTime 锁的时间 + * @param timeUnit 锁的时间单位 + * @return 锁 + */ + @Override + public DistributedLock getLock(String lockKey, long lockTime, TimeUnit timeUnit) { + return new RedissonDistributedLock(redissonClient, lockKey, lockTime, timeUnit); + } +} diff --git a/demo-distributed-lock/demo-distributed-lock-redisson/src/main/resources/application.yml b/demo-distributed-lock/demo-distributed-lock-redisson/src/main/resources/application.yml new file mode 100644 index 0000000..de88ded --- /dev/null +++ b/demo-distributed-lock/demo-distributed-lock-redisson/src/main/resources/application.yml @@ -0,0 +1,17 @@ +server: + port: 8080 + servlet: + context-path: /demo +spring: + sql: + init: + continue-on-error: true + mode: always + schema-locations: + - "classpath:db/schema.sql" + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/spring-boot-demo + username: root + password: root +