首页 > 数据库 >redis面试(十七)MultiLock加锁和释放锁

redis面试(十七)MultiLock加锁和释放锁

时间:2024-08-15 14:55:58浏览次数:14  
标签:释放 加锁 获取 lock redis MultiLock 毫秒 4500

MultiLock

MultiLock,英语直译为多个锁。

redisson分布式锁中的MultiLock这个机制,可以将多个锁合并为一个大锁,对一个大锁进行统一的申请加锁以及释放锁

一次性锁定多个资源,再去处理一些事情,然后事后一次性释放所有的资源对应的锁

RLock lock1 = redisson.getLock("anyLock1");
        RLock lock2 = redisson.getLock("anyLock2");
        RLock lock3 = redisson.getLock("anyLock3");

        RedissonMultiLock multiLock = new RedissonMultiLock(lock1, lock2, lock3);
        multiLock.lock();
        multiLock.unlock();

在项目里使用的时候,很多时候一次性要锁定多个资源,比如说锁掉一个库存,锁掉一个订单,锁掉一个积分,一次性锁掉多个资源,多个资源都不让别人随意修改,然后你再一次性更新多个资源,释放多个锁

MultiLock的源码,我们初步看一下,其实也不过是没什么特别的,就是包裹了多个RedissonLock,底层就是尝试依次对每一个锁都要成功加锁,如果所有的锁都成功加锁了之后,那么就认为MultiLock就成功加锁了

释放锁

依次去释放每一把锁就可以
释放锁的代码一目了然,就是循环释放每一把锁。
在这里插入图片描述

加锁

再看一下的源码
在这里插入图片描述

这里的locks就是RedissonMultiLock中我们传的几个锁,锁的个数*3,基础等待时间baseWaitTime是4500毫秒。
if和else判断中都是算等待时间的逻辑。
而最下面的while死循环,就是要加锁的逻辑,就是不停地加锁,失败了继续加锁。只要没有全部获取到就一直循环。
在这里插入图片描述

RedissonMultiLock.tryLock()方法中
截止到226行,这几个时间分别是
watTime = 4500毫秒
time = 当前时间
remainTime = 4500毫秒
lockWaitTime = 4500毫秒
failedLocksLimit = 0
awaitTime = 4500毫秒

继续走,到for循环里面,取出来locks中的一个锁开始处理
调用了lock.tryLock()方法
这是获取锁的关键代码
lockAcquired = lock.tryLock(awaitTime, newLeaseTime, TimeUnit.MILLISECONDS);

lock是底层的RedissonLock,他没有使用lock.lock(),用的是tryLock(),指定了获取锁等待超时的时间,4500毫秒,必须获取到这个锁,如果获取不到这个锁,就退出,标记为获取锁失败

哪怕是获取到锁之后,这个锁在多长时间内会自动释放,newLeaseTime是-1,因为你的newLeaseTime是-1,所以说如果获取到了锁,会启动一个lock watchdog不断的刷新你的锁key的生存时间为30000毫秒
在这里插入图片描述

继续往下,现在情况是拿到锁之后,不会再走蓝色选中的代码了。

最后走到if (remainTime != -1)代码中去,这里的逻辑是怎么回事呢

remainTime = 4500毫秒
经过了一个lock的获取,可能消耗掉了比如说20毫秒,100毫秒,500毫秒,耗费了500毫秒
remainTime = 4500毫秒 - 500毫秒 = 4000毫秒
time = 当前时间

如果remainTime <= 0,意味着什么呢?获取锁的时间已经超过了4500毫秒了,迄今为止,你获取到这些所的时间,已经超过了预设的4500毫秒了,相当于是你获取多个锁的时间,最多不能超过4500毫秒

如果一旦获取各个锁的时间超过了4500毫秒,此时就会释放掉所有已经获取的锁,然后返回一个false,再次进入while true中的一个死循环,尝试走上述一模一样的流程

获取了三把锁,耗时了1000毫秒,此时remainTime还剩下3500毫秒,4477,4500,23毫秒获取了三把锁
在这里插入图片描述
释放锁的话,就是依次调用所有的锁的释放的逻辑,lua脚本,同步等待所有的锁释放完毕,才会返回

而加锁的话,默认的行为之下,你包裹了几把锁,就会锁数量 * 1500毫秒,获取所有的锁必须在多长时间之内就要结束,如果超时就会重新再次死循环尝试获取锁。使用的是各个锁的tryLock()方法,指定了说在获取每个单独的锁的时候,会有一个获取超时退出的时间

标签:释放,加锁,获取,lock,redis,MultiLock,毫秒,4500
From: https://blog.csdn.net/weixin_41011482/article/details/141222231

相关文章

  • 地理位置存储方案——Redis GEO
    地理位置存储方案——RedisGEO场景引入操作geoaddgeoradius总结场景假设我们需要开发一个代驾程序,司机端的小程序实时把自己的GPS定位上传,然后定位信息缓存到Redis里面。咱们怎么能利用Redis计算出,上车点方圆几公里的司机都有谁呢?这就需要使用Redis的Geo功能。R......
  • Redis Desktop Manager(Redis可视化工具)安装及使用详细教程
    一、安装包下载直接从官网下载,官网下载链接地址:Downloads-Redis二、安装步骤2.1说明RedisDesktopManager是一款简单快速、跨平台的Redis桌面管理工具,也也被称作Redis可视化工具。支持命令控制台操作,以及常用,查询key、rename、delete等操作。2.2安装步骤2.2.1双击运......
  • 解决启动redis:应用程序无法正常启动(0xc000007b)。请单击“确定”关闭应用程序。
    解决处理方法如下目录方法一......
  • Redis实战
    短信登录这一块我们会使用redis共享session来实现商户查询缓存通过本章节,我们会理解缓存击穿,缓存穿透,缓存雪崩等问题,让小伙伴的对于这些概念的理解不仅仅是停留在概念上,更是能在代码中看到对应的内容优惠卷秒杀通过本章节,我们可以学会Redis的计数器功能,结合Lua完成高性能的......
  • Redis集群:概念和部署示例
    目录Redis集群的优点集群模式主从模式缺陷哨兵模式缺陷集群模式(RedisCluster)数据分片原理添加节点删除节点Redis集群的分片方式故障转移机制如果Master只有一个Slave如果Master有多个Slave如果两个Slave票数一样呢?Redis集群部署案例案例拓扑图集群部署步骤......
  • redis-stack安装
    下载:https://github.com/redis-stack/redis-stack/releases/tag/v7.2.0-v10 Linux解压后重命名为redis-stack放到opt目录port6379protected-modenodaemonizenorequirepass密码loadmodule/opt/redis-stack/lib/rediscompat.soloadmodule/opt/redis-stack/lib/re......
  • 发现并处理Redis的大Key和热Key
    大Key和热Key的定义名词解释大Key通常以Key的大小和Key中成员的数量来综合判定,例如:Key本身的数据量过大:一个String类型的Key,它的值为5MB。Key中的成员数过多:一个ZSET类型的Key,它的成员数量为10,000个。Key中成员的数据量过大:一个Hash类型的Key,它的成员数量虽然只有2,000个......
  • redis运维常用命令
    redis运维常用命令命令time查看时间戳与微秒数dbsize查看当前数据库有多少keybgrewriteaof后台进程重写aofbgsave后台保存rdb快照lastsave上次保存时间slaveofmaster-hostport把当前实例设置为master的slaveflushall清空所有......
  • 使用spring-boot集成redis中使用redisTemplate配置泛型导致的问题
    问题<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>......
  • 个人技能总结-redis部分
    Redis部分技能总结架构总结Redis目前在用分为主从模式,sentinel主从模式集群Redis-cluster集群模式3种模式。redis-cluster是多master模式由多个maste共同维护16384个slotredis-sentinel是单master模式主从模式由sentinel控制主从切换和健康检查。种方式的优缺点Sen......