redisson实现的MultiLock、RedLock分布式锁使用场景和可能存在的问题。

目录

一、redisson简介

二、联锁MultiLock和红锁RedLock

三、这两种锁可能会出现的功能缺陷

四、问题的解决方案——个人设想


一、redisson简介

        Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它是一个基于Redis实现的高级分布式锁客户端。同时Redisson是Redis官网指定的RedlLock使用Java语言的实现。

        网络上沿着Redisson的官方文档的介绍已经很多,公平锁、读写锁、信号量、闭锁的用法和源码解析。我这里就不做赘述。本篇博文主要讲使用联锁MultiLock和红锁RedLock的必要场景,以及可能出现的问题

二、联锁MultiLock和红锁RedLock

        因为Redis是CAP中AP架构设计,主打的就是牺牲出现可能性比较小的一致性,达到高可用,高性能的目的。RedLock算法的出现就是为了解决redis实现的分布式锁的不能保证强数据一致性的问题,即便如此,RedLock也只是尽量将数据不一致的可能性降到最低,并不能完全解决这个问题。下面就重点探讨RedLock也可能出现的问题。

        因为RedissonRedLock是继承自RedissonMultiLock的,只是重写了failedLocksLimit方法,即允许锁获取失败个数,获取锁的等待时间等方法。总体来说还是paxos过半机制那一套。所以先说RedissonMultiLock吧。

        所谓联锁,其实就是将多个RLock形成一个锁组合,遍历组合内各个key,分别去获取锁,但是它允许获取失败的锁(Key)为0。具体代码如下:

 protected int failedLocksLimit() {
        return 0;
    }

        这种锁适合资源严格互斥的需要分布式锁加持的方法,也就是适合业务中,可能会需要更新数据的每个key,被严格保护,即使是其他的方法中,需要使其中的一个Key,此时也只能互斥的不能获取资源。在我的上一篇博文中举例:场景(1):一个订单中有多种商品,提交订单的时候,每种商品的库存需要被扣除。这种场景就需要用MultiLock,而不是RedLock。但是如果redis是单机模式,主从模式部署,服务器宕机怎么办呢?没有备份实例,或者备份实例不能自动替换,没有灾备方案。

        那么就用哨兵或者集群模式部署可以解决吗?这两种模式都具备故障转移的功能,但是在转移的过程中,会出现脑裂的问题。也就是多个key中某一个key映射到的某台实例上的数据在故障转译中丢失了一部分,正好这个key的缓存数据在节点故障恢复后丢失了,对应的锁也不存在了。

        RedLock就是为此设计的,即使多个Key中少部分key因为故障,数据丢失,失去了锁,但组合锁总体仍然具备分布式锁功能。具

### Redisson分布式锁的优点 Redisson 是一种基于 Redis 的 Java 工具包,提供了多种分布式对象服务。其分布式锁功能具有以下显著优势: 1. **自动续约机制** 当客户端获取到锁之后,在锁的有效期内如果操作未完成,则 Redisson 会通过内置的任务调度器定期延长锁的过期时间,从而防止因业务逻辑耗时较长而导致锁提前释放的情况发生[^4]。 2. **支持可重入锁** Redisson 提供了 `RLock` 接口来实现可重入锁的功能。这意味着同一个线程可以多次获得同一把锁而不会造成死锁问题。每次加锁都会增加计数器值,解锁则减少计数器值,直到计数值为零时才真正释放锁[^1]。 3. **高可用性可靠性** 如果持有锁的节点突然宕机或者网络分区导致连接中断,那么其他等待中的节点可以在超时后重新尝试获取该锁,避免因为单点故障引发整个系统的不可用状态。 4. **丰富的特性集** - 支持公平锁(Fair Lock):按照请求顺序分配资源访问权限。 - 支持联锁(MultiLock): 同时锁定多个资源。 - 支持红锁(Redlock): 跨越多个独立实例提供更强的一致性保障[^3]。 --- ### Redisson分布式锁的局限性 尽管 Redisson 分布式锁有许多优点,但也存在一些潜在不足之处需要注意: 1. **依赖外部存储服务** Redisson 锁完全建立在 Redis 数据库之上,因此它的性能表现直接受限于底层 Redis 集群的表现情况。一旦 Redis 出现异常(如全量复制期间延迟增大),可能会影响应用层面对应的操作效率[^2]。 2. **复杂度提升** 对于简单的应用场景来说引入 Redisson 可能会造成不必要的技术栈膨胀,并增加了运维成本比如监控、备份等方面的工作负担。 3. **特定环境下的挑战** 在某些特殊架构环境下(例如 Redis 哨兵模式),可能会遇到诸如脑裂等问题影响正常工作流程。 --- ### 使用场景分析 考虑到上述优劣势对比,以下是适合采用 Redisson 分布式锁的一些典型场景描述: - **高频读写分离数据库表记录更新控制** 如电商秒杀活动商品库存扣减过程需要严格串行化处理以防超卖现象的发生; - **跨服务器间共享资源协调管理** 文件上传下载任务队列分发给不同物理机器执行完毕后再统一汇总结果文件; - **定时任务唯一性保证** 多台机器上运行相同 cronjob 计划程序却只允许其中一台实际触发具体动作以规避重复计算风险。 ```java // 获取锁示例代码片段 import org.redisson.api.RLock; import org.redisson.api.RedissonClient; public class DistributedLockExample { private final RedissonClient redissonClient; public void executeWithLock(String lockKey, Runnable task){ RLock lock = redissonClient.getLock(lockKey); try{ boolean isLocked = lock.tryLock(10, TimeUnit.SECONDS); if(isLocked ){ System.out.println(Thread.currentThread().getName()+" acquired the lock."); // 执行任务... task.run(); System.out.println(Thread.currentThread().getName()+ " finished executing and releasing the lock."); }else{ System.err.println("Failed to acquire lock after waiting..."); } }catch(Exception e){ throw new RuntimeException(e.getMessage(),e ); }finally{ lock.unlock(); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

砥砺code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值