Redisson分布式锁

Redisson分布式锁

Redisson 是什么?

Redisson是一个Java库,它为Redis服务器提供分布式和可扩展的Java对象和服务(Set、Multimap、SortedSet、Map、Lock、Semaphore、CountDownLatch、Publish/Subscribe、Bloom filter等)。它允许您将Redis服务器用作Java对象缓存、消息代理或分布式Java对象存储。

Redisson的一个常见用例是将其用作分布式锁管理器。分布式锁管理器是允许分布式进程同步访问共享资源的软件组件。分布式锁管理器可用于确保一次只有一个进程可以访问资源,这对于防止竞争条件和其他类型的同步问题非常有用。

要将Redisson用作分布式锁管理器,可以使用RLock接口,该接口提供获取、释放和更新锁的方法。例如,以下代码片段显示了如何使用Redisson获取和释放锁:

// Create a RedissonClient instance
RedissonClient redisson = Redisson.create();

// Get a lock instance
RLock lock = redisson.getLock("myLock");

// Acquire the lock
lock.lock();

try {
    // Access the shared resource
} finally {
    // Release the lock
    lock.unlock();
}

Redisson还提供其他类型的锁,如ReadWriteLock和PermitExpirableSemaphore,它们可以用于不同类型的同步场景。

Redisson加锁的过程

要使用Redisson获取锁,可以使用RLock接口的lock()方法。此方法将阻塞,直到获取锁,或者直到获取锁超时(如果指定了超时)。

例如,以下代码片段显示了如何获取超时为10秒的锁:

// Create a RedissonClient instance
RedissonClient redisson = Redisson.create();

// Get a lock instance
RLock lock = redisson.getLock("myLock");

// Try to acquire the lock within 10 seconds
boolean locked = lock.tryLock(10, TimeUnit.SECONDS);

if (locked) {
    try {
        // Access the shared resource
    } finally {
        // Release the lock
        lock.unlock();
    }
} else {
    // Lock acquisition timed out
}

如果您想在不阻塞的情况下获取锁(即,如果锁不可用,您想立即返回),可以使用tryLock()方法,该方法返回一个布尔值,指示是否获取了锁。

您还可以指定锁的租用时间,即释放后锁将保持锁定的时间。如果您希望确保锁在释放后不会立即被另一个进程重新获取,那么这将非常有用。要指定租赁时间,可以使用lock(long leaseTime,TimeUnit单位)或tryLock(long waitTime,long leaseTime,TimeUnit单元)方法。
加锁的过程图:
Redisson分布式锁_第1张图片从上图可知:
1、应用1想要拿到锁,首先去redis看一下lck_acc_000里面的map,value是不是0,如果为0表示锁可以使用。

2、应用1拿到锁之后,需要上锁,上锁是通过Lua脚本(保证原子性)实现。

3、上锁之后value变为1。

4、应用2也想要lck_acc_000的锁,但是value为1,应用2可以自旋等待锁,也可以直接返回,应用2也可以拿到锁还有多久时间释放。

5、锁默认的失效时间为30秒,应用1可能执行时间大于30秒,执行过程释放锁这是不讲武德的。

6、所以应用1有一个watch dog看门狗,看门狗没过10秒就会把失效时间延续到30秒。

Redisson释放锁的过程

Redisson分布式锁_第2张图片1、调用unlock方法会释放锁
2、redis上的value表示重入次数,重入:比如方法A调用方法B,A和B都使用了锁L,那么锁过程变为A.Lock -> B.Lock -> B.UnLock -> A.UnLock ,B加锁时value会变为2,表示重入了一次,B释放锁value减1,当value为0时表示锁被释放

Redisson锁的优劣

在某些情况下,使用像Redisson这样的分布式锁管理器可能会很有用,因为您需要跨多个进程或线程同步对共享资源的访问。使用Redisson进行分布式锁定的一些潜在好处包括:

1、可扩展性:Redisson设计用于分布式系统,可以通过向集群中添加更多Redis服务器来横向扩展。这使得它适合在高并发环境中使用。

2、容错:即使一个或多个Redis服务器宕机,Redison也可以自动从故障中恢复并保持锁定状态。

3、易用性:Redisson为获取、释放和更新锁提供了一个简单的API,并支持针对不同同步场景的各种类型的锁(例如,读/写锁、信号量)。

然而,在使用Redison进行分布式锁定时,也有一些潜在的缺点需要考虑:

1、性能:获取和释放锁可能是一项相对昂贵的操作,尤其是当需要在多个Redis服务器上更新锁状态时。这会影响应用程序的性能,尤其是在高并发环境中。

2、复杂性:使用像Redisson这样的分布式锁管理器可能会给应用程序带来额外的复杂性,因为您需要仔细管理锁状态并处理故障和超时。

3、单点故障:如果Redisson依赖的Redis服务器宕机,锁管理器将无法运行。这可以通过使用Redis Sentinel或Redis Cluster实现高可用性来缓解,但这仍然是一个需要考虑的潜在风险。

上面是人工智能ChatGpt说的,下面是人说的:
优点:
1、支持可重入
2、不依靠redis本身的实现,即不依靠setNX
缺点:
1、实现复杂
2、存在分布式问题:比如说redis一主一从,应用1拿到锁,value设置为1,然后主挂了value=1还没同步,从提升为主,但是加锁信息没有同步过来value还是为0,应用2发现value为0拿到锁,这就会造成两个应用拿到锁的情况。可以使用RedLock解决(存在争议)。

你可能感兴趣的:(分布式,java,数据库)