首页 > 数据库 >面试官问:Redis 分布式锁如何自动续期?

面试官问:Redis 分布式锁如何自动续期?

时间:2023-08-10 12:33:24浏览次数:32  
标签:面试官 Redis redis 看门狗 续期 方法 分布式

资深面试官:你们项目中的分布式锁是怎么实现的?

老任:基于redis的set命令,该命令有nx和ex选项。

资深面试官:那如果锁到期了,业务还没结束,如何进行自动续期呢?

老任:这个......面试官,您上个问题是啥来着?

资深面试官:你们项目中分布式锁是怎么实现的。

老任:我们直接使用了Redisson中提供的分布式锁。

资深面试官:你给我滚!!!

面试官问:Redis 分布式锁如何自动续期?_看门狗

Redisson的看门狗机制

使用redis分布式锁时,为了防止种种异常情况下,锁无法正常“释放”的情况,我们都会为锁设置个超时时间。

这时候,又会存在一个尴尬的情况,如果设置了超时时间,但在规定的时间内,业务逻辑还没有执行完,锁就被释放了......那么针对一些特定的业务逻辑,这可能又会引起新的问题......

面试官问:Redis 分布式锁如何自动续期?_redis_02


所以Redisson就给我们提供了监控锁的看门狗机制,通过该机制,锁被关闭前,看门狗会不断的延长锁的超时时间。默认情况下,看门狗的锁超时时间lockWatchdogTimeout是30s,该值当然也是可以设置的。

面试官问:Redis 分布式锁如何自动续期?_看门狗_03

源码伺候

现在让我们进入tryLock()方法来查看一下实现源码,在该方法中调用tryAcquire()方法。

面试官问:Redis 分布式锁如何自动续期?_redis_04

tryAcquire()方法中调用tryAcquireAsync()方法。

面试官问:Redis 分布式锁如何自动续期?_分布式锁_05

tryAcquireAsync()方法中,如果leaseTime小于等于0,调用scheduleExpirationRenewal方法进行续期。

面试官问:Redis 分布式锁如何自动续期?_分布式锁_06

从该方法中看到,leaseTime表示锁的超时时间,如果调用tryLock方法加锁时,设置了该参数,看门狗机制不会生效。

scheduleExpirationRenewal()方法中调用了renewExpiration()方法。

面试官问:Redis 分布式锁如何自动续期?_看门狗_07

renewExpiration()方法中启用了一个timeout定时器,internalLockLeaseTime的1/3时间去执行续期操作,续期的方法是renewExpirationAsync()。

面试官问:Redis 分布式锁如何自动续期?_看门狗_08

renewExpirationAsync的方法内容如下,里面定义了lua脚本,如果key存在,执行pexpire命令进行续期操作。

protected CompletionStage<Boolean> renewExpirationAsync(long threadId) {
    return this.evalWriteAsync(
        this.getRawName(), 
        LongCodec.INSTANCE, 
        RedisCommands.EVAL_BOOLEAN, 
        "if (redis.call('hexists', KEYS[1], ARGV[2]) == 1) then redis.call('pexpire', KEYS[1], ARGV[1]); return 1; end; return 0;", 
        Collections.singletonList(this.getRawName()), 
        this.internalLockLeaseTime, 
        this.getLockName(threadId));
}

以上就是redis分布式锁到期后,业务还没结束时的自动续期解决方案,现在你会了吗?关注小千,干货天天都不断哦!

标签:面试官,Redis,redis,看门狗,续期,方法,分布式
From: https://blog.51cto.com/u_14319530/7033072

相关文章

  • java 中怎么部署使用redis
    在Java中使用Redis,你需要完成以下步骤来部署和使用Redis:1.下载并安装Redis:你可以从Redis官方网站下载Redis的最新版本,并按照官方文档提供的说明进行安装。2.添加Redis的Java依赖:在你的Java项目中,你需要添加Redis的Java客户端依赖。目前比较常用的JavaRedis客户端有Jedis、Lettuc......
  • k8s上部署Redis集群
    1.部署scapiVersion:storage.k8s.io/v1kind:StorageClassmetadata:name:nfs-redisprovisioner:kubernetes.io/no-provisionervolumeBindingMode:WaitForFirstConsumer2.通过cm创建redis配置文件apiVersion:v1kind:ConfigMapmetadata:name:redis-cluster......
  • redis for windows 6/7安装包定时弹黑窗口解决办法
    这是冰河之刃渡桥计划的一部分,使用Windows计划任务自动运行redis服务。 博客地址:https://www.cnblogs.com/binghe021 下载地址:码云 https://gitee.com/binghe021/redis-setupgithub  https://github.com/binghe021/redis-setup安装包的实现原理是借助计划任务来自动运行redis......
  • 条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集
    前言AmazonElastiCacheforRedis是速度超快的内存数据存储,能够提供亚毫秒级延迟来支持实时应用程序。适用于Redis的ElastiCache基于开源Redis构建,可与RedisAPI兼容,能够与Redis客户端配合工作,并使用开放的Redis数据格式来存储数据。适用于Redis的ElastiCache......
  • Redis
    Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Redis根本是使用内存存储。第一次取数据,会先去内存取,如果没有再去硬盘上去取,取到数据后会在内存上留一份。第二次来去这些数据的时候直接去内存取了,这样速度......
  • redis 2.8--7.0 常用数据类型及性能测试工具
    redis2.8--7.01.redis-cli2.redisincrpageviewredisincrpageviewredisgetpageview3.Redishash是一个string类型的field(字段)和value(值)的映射表,hash特别适合用于存储对象。Redis中每个hash可以存储232-1键值对(40多亿)hash:hmsetkeyfiled1valuefil......
  • redis协议介绍
    ......
  • 数据库-mysql/postgresql/mongo/oracle/redis 物理备份与恢复的执行方式有
    以下是每个数据库的物理备份与恢复的执行方式示例:MySQL:备份:使用mysqldump命令进行备份。示例:mysqldump-uusername-pdatabase_name>backup.sql恢复:使用mysql命令从备份文件中恢复数据。示例:mysql-uusername-pdatabase_name<backup.sqlPostgreSQL:备份:使用pg_d......
  • docker 启动redis 7.0.12
    1.拉取镜像 dockerpullredis:7.0.122.去官网下载对应的包,解压拿到redis.conf,下载地址:https://redis.io/download/bind127.0.0.1#注释掉这部分,使redis可以外部访问daemonizeno#用守护线程的方式启动requirepass你的密码#给redis设置密码appendonlyyes#r......
  • 山东布谷科技直播程序源码使用Redis进行服务器横向扩展
    当今,直播程序源码平台作为新媒体时代主流,受到了世界各地人民的喜爱,这也使得直播程序源码平台用户数量的庞大,也难免会出现大量用户同时访问服务器,使服务器过载的情况,当服务器承受不住的时候,可能就会造成服务器崩溃,为了应对这一问题,直播程序源码的开发人员在开发服务器的时候就要去使......