@@ -14,6 +14,27 @@ | |||||
<properties> | <properties> | ||||
<java.version>17</java.version> | <java.version>17</java.version> | ||||
<redisson.version>3.17.6</redisson.version> | |||||
</properties> | </properties> | ||||
<dependencies> | |||||
<dependency> | |||||
<groupId>com.xkcoding</groupId> | |||||
<artifactId>demo-distributed-lock-api</artifactId> | |||||
<version>1.0.0-SNAPSHOT</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.redisson</groupId> | |||||
<artifactId>redisson</artifactId> | |||||
<version>${redisson.version}</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.projectlombok</groupId> | |||||
<artifactId>lombok</artifactId> | |||||
<optional>true</optional> | |||||
</dependency> | |||||
</dependencies> | |||||
</project> | </project> |
@@ -0,0 +1,21 @@ | |||||
package com.xkcoding.distributed.lock; | |||||
import org.springframework.boot.SpringApplication; | |||||
import org.springframework.boot.autoconfigure.SpringBootApplication; | |||||
/** | |||||
* <p> | |||||
* 启动器 | |||||
* </p> | |||||
* | |||||
* @author yangkai.shen | |||||
* @date 2022-09-02 22:34 | |||||
*/ | |||||
@SpringBootApplication | |||||
public class RedissonDistributedLockApplication { | |||||
public static void main(String[] args) { | |||||
SpringApplication.run(RedissonDistributedLockApplication.class, args); | |||||
} | |||||
} |
@@ -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; | |||||
/** | |||||
* <p> | |||||
* Redisson分布式锁实现 | |||||
* </p> | |||||
* | |||||
* @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(); | |||||
} | |||||
} |
@@ -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; | |||||
/** | |||||
* <p> | |||||
* 基于Redisson分布式锁自动装配类 | |||||
* </p> | |||||
* | |||||
* @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); | |||||
} | |||||
} |
@@ -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; | |||||
/** | |||||
* <p> | |||||
* 获取一把 Redisson 分布式锁 | |||||
* </p> | |||||
* | |||||
* @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); | |||||
} | |||||
} |
@@ -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 | |||||