Java | 使用 Spring Redis Lock 實現(xiàn)分布式鎖
Spring Redis Lock 配置
Table of Contents
前言使用步驟1. 引入庫2. 配置 redis3. 增加配置4. 使用
前言
在我們項目經(jīng)常遇到并發(fā)問題,在單個項目中,使用自帶的鎖即可完成并發(fā)控制,在多個項目中,就需要使用分布式鎖來解決。這里講一下使用 Redis 來做分布式鎖實現(xiàn)方案
使用步驟
1. 引入庫
在 Spring Boot 項目會根據(jù) Spring Boot 依賴管理自動配置版本號
Maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-integration</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2. 配置 redis
在 application-xxx.yml 中配置
spring:
redis:
host: 127.0.0.1
port: 6379
timeout: 2500
password: xxxxx
3. 增加配置
RedisLockConfig.java
import java.util.concurrent.TimeUnit;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.integration.redis.util.RedisLockRegistry;
@Configuration
public class RedisLockConfig {
@Bean
public RedisLockRegistry redisLockRegistry(RedisConnectionFactory redisConnectionFactory) {
return new RedisLockRegistry(redisConnectionFactory, "redis-lock",
TimeUnit.MINUTES.toMillis(10));
}
}
4. 使用
@Autowired
private RedisLockRegistry lockRegistry;
Lock lock = lockRegistry.obtain(key);
boolean locked = false;
try {
locked = lock.tryLock();
if (!locked) {
// 沒有獲取到鎖的邏輯
}
// 獲取鎖的邏輯
} finally {
// 一定要解鎖
if (locked) {
lock.unlock();
}
}
評論
圖片
表情
