在 Spring Boot 中,你可以使用 StringRedisTemplate
来实现分布式锁。分布式锁通常基于 Redis 的 SETNX(SET if Not eXists)命令实现,它可以确保只有一个客户端能够获得锁。以下是一个使用 Spring Boot 和 Redis 实现分布式锁的示例代码:
首先,确保你已经在 Spring Boot 项目中添加了 Redis 相关的依赖,如 spring-boot-starter-data-redis
。
接下来,创建一个分布式锁的帮助类:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.core.script.RedisScript;
import org.springframework.stereotype.Component;
import java.util.Collections;
import java.util.concurrent.TimeUnit;
@Component
public class DistributedLock {
@Autowired
private StringRedisTemplate redisTemplate;
private static final String LOCK_KEY = "my_lock_key";
public boolean tryLock(long timeout, TimeUnit unit) {
try {
// 构建 Lua 脚本,用于在 Redis 中执行原子操作
String luaScript =
"if redis.call('setnx', KEYS[1], ARGV[1]) == 1 " +
"then return redis.call('pexpire', KEYS[1], ARGV[2]) else return 0 end";
RedisScript<Long> script = new DefaultRedisScript<>(luaScript, Long.class);
// 执行 Lua 脚本
Long result = redisTemplate.execute(script, Collections.singletonList(LOCK_KEY), "1", String.valueOf(unit.toMillis(timeout)));
return result != null && result == 1;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public void releaseLock() {
redisTemplate.delete(LOCK_KEY);
}
}
在上述代码中,我们创建了一个名为 DistributedLock
的 Spring Bean,该 Bean 使用 StringRedisTemplate
来与 Redis 进行交互。tryLock
方法尝试获取锁,如果成功获取到锁,则返回 true
,否则返回 false
。releaseLock
方法用于释放锁。
你可以在需要使用分布式锁的地方注入 DistributedLock
并使用它来保护关键的临界区。例如:
@Autowired
private DistributedLock distributedLock;
public void someMethodRequiringLock() {
try {
if (distributedLock.tryLock(30, TimeUnit.SECONDS)) {
// 执行需要锁定的代码
} else {
// 未能获取锁
}
} finally {
distributedLock.releaseLock();
}
}
这样,你就可以在 Spring Boot 项目中使用 StringRedisTemplate
实现分布式锁了。确保适当地处理异常和锁的释放以确保程序的稳定性。