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 @@
+ * 启动器 + *
+ * + * @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 +