在Spring Boot中,我們可以使用synchronized
關鍵字來實現分布式鎖。但是,這種方法并不是最佳實踐,因為它只能在單個JVM中工作。為了在分布式系統中實現分布式鎖,我們需要使用分布式鎖解決方案,例如Redis、Zookeeper或者數據庫。
以下是一個使用Redis實現分布式鎖的示例:
pom.xml
文件中添加以下內容:<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
application.properties
文件中配置Redis連接信息:spring.redis.host=localhost
spring.redis.port=6379
RedisLock
類,用于實現分布式鎖:import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
@Component
public class RedisLock {
@Autowired
private StringRedisTemplate stringRedisTemplate;
public boolean lock(String key, String value, long expire) {
return stringRedisTemplate.opsForValue().setIfAbsent(key, value, expire, TimeUnit.SECONDS);
}
public void unlock(String key, String value) {
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
stringRedisTemplate.execute(new DefaultRedisScript<>(script, Long.class), Arrays.asList(key), value);
}
}
RedisLock
類進行加鎖和解鎖:import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@Autowired
private RedisLock redisLock;
@GetMapping("/test")
public String test() {
String key = "my_lock";
String value = UUID.randomUUID().toString();
boolean locked = redisLock.lock(key, value, 30);
if (locked) {
try {
// 執行需要同步的代碼
} finally {
redisLock.unlock(key, value);
}
} else {
return "獲取鎖失敗";
}
return "成功";
}
}
這樣,你就可以在Spring Boot中使用Redis實現分布式鎖了。請注意,這個示例僅用于演示目的,實際應用中可能需要根據你的需求進行調整。