官方的分布式锁叫做RedLock,实际使用案例

墨蓝 2024-03-23 10:06 38阅读 0赞

好的,那我们一步步来实现一个使用RedLock的小案例吧。

首先,我们需要在`pom.xml`文件中添加Redisson的依赖:

```

org.redisson

redisson

3.15.5


```

然后,我们需要在SpringBoot项目中配置Redisson的连接信息,这里我们可以写一个配置类:

```java
@Configuration
public class RedisConfig {

@Value(“${spring.redis.host}“)
private String host;

@Value(“${spring.redis.port}“)
private String port;

@Bean(destroyMethod=”shutdown”)
RedissonClient redisson() {
Config config = new Config();
config.useSingleServer().setAddress(“redis://“ + host + “:” + port);
return Redisson.create(config);
}
}
```

上面的配置类中,我们使用了`useSingleServer()`方法,这是因为我们只使用了单台Redis服务器,如果你使用的是Redis集群,则需要使用`useClusterServers()`方法并设置多个节点的地址。

接下来,我们编写一个controller作为演示,在controller中使用RedLock进行分布式锁的测试:

```java
@RestController
public class TestController {

@Autowired
private RedissonClient redissonClient;

@GetMapping(“/lock”)
public String lock() throws InterruptedException {
RLock lock = redissonClient.getLock(“test_lock”);
try {
boolean res = lock.tryLock(10, 60, TimeUnit.SECONDS);
if (res) {
// 执行业务逻辑
System.out.println(“加锁成功,开始执行业务逻辑”);
Thread.sleep(5000);
System.out.println(“业务逻辑执行完毕,释放锁”);
return “success”;
} else {
System.out.println(“尝试加锁失败”);
return “fail”;
}
} finally {
lock.unlock();
}
}
}
```

在上述代码中,我们首先通过RedissonClient获取到一个名为`test_lock`的RedLock实例,然后使用`tryLock()`方法去尝试加锁,其中第一个参数表示等待时间,第二个参数表示锁的过期时间,如果在等待时间内成功加锁,则执行业务逻辑,否则返回失败。当业务逻辑执行完毕时,需要使用`unlock()`方法释放锁。

在最后,我们可以使用浏览器和Postman等工具访问`http://localhost:8080/lock\`,就可以进行测试了。

注意事项:

  1. `lock()`方法的执行时间不应太长,否则可能会影响性能和并发度;
  2. 使用RedLock时,在多个实例之间,需要使用相同的`lockKey`,否则会出现无法互斥的情况;
  3. 可能会出现网络抖动、程序崩溃等导致锁未能正确释放的情况,我们需要使用看门狗机制,这里为了简单起见,就没有加入。

发表评论

表情:
评论列表 (有 0 条评论,38人围观)

还没有评论,来说两句吧...

相关阅读

    相关 分布式 Redisson Redlock

    > 昨儿在前人写的代码里发现了 setnx+expire思路实现的分布式锁,但是真的大流量场景还是问题很大的。今天问了个架构师,说了很多,说了关于Redisson 、Redlo

    相关 RedLock分布式

    1. 获取当前系统时间(毫秒数)。 2. 按顺序依次向 N 个 Redis 节点执行获取锁的操作。这个获取操作跟前面基于单 Redis 节点获取锁的过程相同,包含随机字符串

    相关 分布式Redlock

    分布式锁,存在无法解决的问题,一起回顾如下 1、为了提高单redis的可用性,给master挂了一个从slave节点,因为主从复制是异步的,会出现不同客户端同时获取锁的情况