好的,下面是一个基于 RedisTemplate 的 RedLock 示例代码,它将三个锁对象分别部署在不同的 Redis 节点上:
```java
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
}
@Service
public class RedLockService {
private final RedisTemplate redisTemplate;
public RedLockService(RedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
public void doSomethingWithRedLock() {
Config config1 = new Config();
config1.useSingleServer().setAddress("redis://192.168.0.1:6379").setPassword("password");
Config config2 = new Config();
config2.useSingleServer().setAddress("redis://192.168.0.2:6379").setPassword("password");
Config config3 = new Config();
config3.useSingleServer().setAddress("redis://192.168.0.3:6379").setPassword("password");
RedissonClient redissonClient1 = Redisson.create(config1);
RedissonClient redissonClient2 = Redisson.create(config2);
RedissonClient redissonClient3 = Redisson.create(config3);
RLock lock1 = redissonClient1.getLock("lock1");
RLock lock2 = redissonClient2.getLock("lock2");
RLock lock3 = redissonClient3.getLock("lock3");
RedLock redLock = new RedLock(lock1, lock2, lock3);
try {
boolean isLocked = redLock.tryLock(100, 10_000, TimeUnit.MILLISECONDS);
if (isLocked) {
// 获取到了 RedLock,执行业务逻辑
// ...
} else {
// 获取 RedLock 失败,抛出异常或者进行其他处理
throw new RuntimeException("Failed to acquire RedLock");
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();