Browse Source

分布式锁模块之 基于 redisson 实现分布式锁 案例完成

3.x
Yangkai.Shen 2 years ago
parent
commit
7d9fdbe76a
6 changed files with 172 additions and 0 deletions
  1. +21
    -0
      demo-distributed-lock/demo-distributed-lock-redisson/pom.xml
  2. +21
    -0
      demo-distributed-lock/demo-distributed-lock-redisson/src/main/java/com/xkcoding/distributed/lock/RedissonDistributedLockApplication.java
  3. +48
    -0
      demo-distributed-lock/demo-distributed-lock-redisson/src/main/java/com/xkcoding/distributed/lock/autoconfigure/RedissonDistributedLock.java
  4. +31
    -0
      demo-distributed-lock/demo-distributed-lock-redisson/src/main/java/com/xkcoding/distributed/lock/autoconfigure/RedissonDistributedLockAutoConfiguration.java
  5. +34
    -0
      demo-distributed-lock/demo-distributed-lock-redisson/src/main/java/com/xkcoding/distributed/lock/autoconfigure/RedissonDistributedLockClient.java
  6. +17
    -0
      demo-distributed-lock/demo-distributed-lock-redisson/src/main/resources/application.yml

+ 21
- 0
demo-distributed-lock/demo-distributed-lock-redisson/pom.xml View File

@@ -14,6 +14,27 @@

<properties>
<java.version>17</java.version>
<redisson.version>3.17.6</redisson.version>
</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>

+ 21
- 0
demo-distributed-lock/demo-distributed-lock-redisson/src/main/java/com/xkcoding/distributed/lock/RedissonDistributedLockApplication.java View File

@@ -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);
}

}

+ 48
- 0
demo-distributed-lock/demo-distributed-lock-redisson/src/main/java/com/xkcoding/distributed/lock/autoconfigure/RedissonDistributedLock.java View File

@@ -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();
}
}

+ 31
- 0
demo-distributed-lock/demo-distributed-lock-redisson/src/main/java/com/xkcoding/distributed/lock/autoconfigure/RedissonDistributedLockAutoConfiguration.java View File

@@ -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);
}
}

+ 34
- 0
demo-distributed-lock/demo-distributed-lock-redisson/src/main/java/com/xkcoding/distributed/lock/autoconfigure/RedissonDistributedLockClient.java View File

@@ -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);
}
}

+ 17
- 0
demo-distributed-lock/demo-distributed-lock-redisson/src/main/resources/application.yml View File

@@ -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


Loading…
Cancel
Save