Redisson 是一个基于 Redis 的 Java 驻内存数据网格(In-Memory Data Grid),它不仅提供了一系列的分布式 Java 常用对象,还提供了许多分布式服务。Redisson 提供了使用 Redis 的最简单和最便捷的方法,其宗旨是促进使用者对 Redis 的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。
Redisson 的分布式锁实现
Redisson 提供了强大的分布式锁实现,解决了传统 Redis 分布式锁的一些问题,如不可重入、不可重试、超时释放和主从一致性问题。以下是 Redisson 分布式锁的一些关键特性和用法:
1. 可重入锁
Redisson 支持可重入锁,这意味着同一个线程可以多次获取同一把锁。这是通过在 Redis 中使用哈希结构实现的,其中 key 用于锁定资源,field 用于标识唯一成功获取锁的对象,value 用于累计同一个线程成功获取相同锁的次数。
2. 重试机制
Redisson 提供了重试机制,如果因为网络问题等不可控因素导致锁竞争失败,Redisson 会自动进行重试,直到获取到锁或者超时。
3. 看门狗机制(WatchDog)
Redisson 的看门狗机制可以自动续期锁,避免因业务执行耗时较长导致锁提前释放的问题。当锁的过期时间即将到达时,守护线程会自动续期,保证操作在有锁状态下执行。
4. Redlock 算法
Redisson 支持 Redlock 算法,通过在多个 Redis 节点上设置锁,确保即使某些节点出现故障,锁的正确性也能得到保证。
Redisson锁
java
RLock lock = redissonClient.getLock("order:"+userId);


可重入锁(Reentrant Lock)是一种特殊的锁机制,允许同一个线程多次获取同一把锁,而不会导致死锁。这种锁机制在处理复杂的业务逻辑时非常有用,因为它允许线程在不同的嵌套调用中多次获取锁,而不会因为重复获取锁而导致线程阻塞。
可重入锁的特点
-
可重入性
- 同一个线程可以多次获取同一把锁,每次获取锁时,锁的计数器会递增;每次释放锁时,锁的计数器会递减。只有当计数器为零时,其他线程才能获取该锁。
-
持有锁的线程可以再次获取锁
- 如果一个线程已经持有了某把锁,它可以在不释放该锁的情况下再次获取该锁,而不会导致死锁。
-
锁的释放必须与获取锁的次数一致
- 每次获取锁后,必须调用一次
unlock方法来释放锁。只有当锁的计数器为零时,其他线程才能获取该锁。
- 每次获取锁后,必须调用一次
可重入锁(Reentrant Lock)主要解决的问题之一是死锁。死锁是指两个或多个线程在等待对方释放锁,从而导致所有线程都无法继续执行的情况。可重入锁通过允许同一个线程多次获取同一把锁,避免了因重复获取锁而导致的死锁问题。
死锁的典型场景
假设有一个场景,两个线程分别需要获取两个锁 A 和 B,但获取锁的顺序不同:
-
线程 1 先获取锁
A,然后尝试获取锁B。 -
线程 2 先获取锁
B,然后尝试获取锁A。
如果线程 1 已经获取了锁 A,线程 2 已经获取了锁 B,此时线程 1 等待线程 2 释放锁 B,线程 2 等待线程 1 释放锁 A,这就导致了死锁。
