redis实现分布式锁的方式,他们有什么区别
SETNX
使用方法:SETNX(SET if Not eXists)是 Redis 中一个经典的用于设置分布式锁的命令。它的作用是当指定的键不存在时,才会设置该键的值,如果键已经存在则不做任何操作。但 SETNX 本身不支持直接设置过期时间。
坏处:为了避免死锁(例如持有锁的客户端崩溃而未释放锁),需要额外使用 EXPIRE 命令来为锁设置过期时间。然而,SETNX 和 EXPIRE 是两个独立的命令,在高并发场景下,可能会出现 SETNX 执行成功,但在执行 EXPIRE 之前客户端崩溃的情况,这样就会导致锁没有设置过期时间。他们不是一个原子操作。
setIfAbsent
使用方法:setIfAbsent(key, value, expireTime, TimeUnit.SECONDS) 是 Spring Data Redis 对 Redis 中 SET key value NX PX timeout 命令的封装。这个命令将设置键值对、判断键是否存在以及设置过期时间这三个操作合并为一个原子操作。
Redisson 实现分布式锁
使用方法:开发者只需创建 RLock 对象,调用 lock() 或 tryLock() 方法获取锁,调用 unlock() 方法释放锁,无需关心底层的 Redis 命令和复杂的实现细节。
redission锁的好处
功能特性丰富
1、可重入锁:Redisson 支持可重入锁,即同一个线程可以多次获取同一把锁,而不会产生死锁。这在一些复杂的业务逻辑中非常有用,例如递归调用时可以安全地使用锁。
2、公平锁:提供公平锁的实现,保证线程按照请求锁的顺序依次获得锁,避免某些线程长时间得不到锁的情况,适用于对锁获取顺序有严格要求的场景。
3、联锁和红锁:支持联锁(MultiLock)和红锁(RedLock)。联锁可以将多个锁作为一个整体进行加锁和解锁操作;红锁用于在多个 Redis 节点上实现高可用的分布式锁,提高了锁的可靠性。
自动续期机制
Redisson 实现了锁的自动续期机制,当持有锁的线程在执行任务过程中,若锁的过期时间快到了,Redisson 会自动延长锁的过期时间,避免因业务逻辑执行时间过长导致锁提前释放,从而保证业务逻辑的原子性。
异常处理和可靠性
Redisson 对异常情况进行了良好的处理,例如在获取锁或释放锁时出现网络异常等情况,会有相应的重试机制和错误处理逻辑,提高了系统的可靠性。

浙公网安备 33010602011771号