在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实现分布式锁了。请注意,这个示例仅用于演示目的,实际应用中可能需要根据你的需求进行调整。