以下是一个基于 Java 和 RedisTemplate 实现 RedLock 的示例:
```java
import org.springframework.data.redis.core.RedisTemplate;
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class RedLockExample {
private RedisTemplate redisTemplate;
public RedLockExample(RedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
public void doSomethingWithLock() {
// 创建 Redisson 客户端
Config config = new Config();
config.useSingleServer().setAddress("redis://localhost:6379");
RedissonClient redissonClient = Redisson.create(config);
// 创建 RedLock 对象
List locks = new ArrayList<>();
locks.add(redissonClient.getLock("lock1"));
locks.add(redissonClient.getLock("lock2"));
locks.add(redissonClient.getLock("lock3"));
RLock redLock = redissonClient.getRedLock(locks);
try {
// 获取锁并执行需要保护的代码
boolean isLocked = redLock.tryLock(500, 10000, TimeUnit.MILLISECONDS);
if (isLocked) {
System.out.println("Lock acquired");
// do something...
} else {
System.out.println("Failed to acquire lock");
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
// 释放锁
redLock.unlock();
redissonClient.shutdown();
}
}
}
```
在上面的示例中,我们首先创建了一个 RedisTemplate 对象,并使用该对象创建了一个 RedLockExample 对象。然后,在获取锁时,我们使用 Redisson 客户端创建了一个 RedLock 对象,并尝试在一定时间内获取锁。如果成功获取锁,则执行需要保护的代码;否则,返回获取锁失败的信息。最后,我们通过调用 `unlock()` 方法来手动释放锁,并关闭 Redisson 客户端。
需要注意的是,RedLock 的使用需要满足一定的条件,包