首页 > 数据库 >redis分布式锁解决业务处理时间超过锁失效时间的问题

redis分布式锁解决业务处理时间超过锁失效时间的问题

时间:2022-08-19 15:37:07浏览次数:109  
标签:释放 过期 redis 时间 租约 失效 分布式 客户端

回顾redis分布式锁

获取锁成功后为了防止客户端进程失败无法正常释放锁进而导致其他的客户端再也获得不到锁,在使用SETNX的时候我们还需要为每个锁加一个过期时间Expire Time, 这样即使在客户端不能正常释放锁的情况下,过期时间到了之后,Redis会自动释放掉锁来让别的客户端能够继续申请锁。这就是一种典型的租约机制,客户端申请了一个租约时长为lock_timeout的锁,客户端可以在租约期间使用完之后正常释放锁,如果过了租约时间,即使客户端没有释放锁,Redis也会自动释放掉这个锁。

问题:

这个租约日期设置的时间长短是个问题
如果设置的过短,那么就可能客户端还没用完锁,锁就被Redis给释放了,造成后续多个客户端同时访问某资源的错误,如果设置的时间过长,那么当客户端因为failure不能正常释放锁的时候,其他客户端就需要等待较长的时间(时间过了锁的租约期)才能够重新释放锁。

解决方法

方法1:定时自动去续约(expire key second)

具体操作:
搞一个watchdog:当我们并不知道自己将会用多久的锁时,我们为该锁设置一个较小的lock_timeout,同时每隔一段时间在该锁过期之前,就自动的向服务器延长该锁的lifetime。

参考[https://zhuanlan.zhihu.com/p/101913195]

方法2:记录业务处理时长,设置过期时间:业务时长+一定时间

具体操作
每次获取锁后,记录业务代码执行的时长,在redis中存一个上次时长,再次获取锁时 设置过期时间为上次时长+N秒

参考:https://github.com/SPSCommerce/redlock-py/issues/30

标签:释放,过期,redis,时间,租约,失效,分布式,客户端
From: https://www.cnblogs.com/aleiyoy/p/16601888.html

相关文章

  • Redis - Replication
    AtthebaseofRedisreplicationthereisaleaderfollower(master-replica)replicationthatissimpletouseandconfigure.ItallowsreplicaRedisinstances......
  • spark伪分布式搭建
    spark伪分布式搭建#配置环境[[email protected]]#vi/etc/profile{exportSPARK_HOME=/opt/app/spark-2.3.1exportPATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/s......
  • Redis - Evictions
    Thisbehavioriswellknowninthedevelopercommunity,sinceitisthedefaultbehaviorforthepopularmemcachedsystem.MaxmemoryconfigurationdirectiveTh......
  • 关于SpringBoot整合redis使用Lettuce客户端超时问题
    问题起因使用到Lettuce连接redis,一段时间后不操作,再去操作redis,会报连接超时错误,在其重连后又可使用。原因是:Lettuce自适应拓扑刷新(Adaptiveupdates)与定时拓扑刷新(Peri......
  • Docker安装Redis
    1.下载Redis镜像sudodockerpullredis 2.启动Redissudomkdir-p/mydata/redis/confsudotouch/mydata/redis/conf/redis.confsudodockerrun-p63......
  • Redis 内存占满
    1.案例redis内存占用满了错误提示:OOMcommandnotallowedwhenusedmemory>‘maxmemory’2.排查步骤确定哪台redis服务器使用set命令随便设置值,查看是否成......
  • docker compose搭建redis7.0.4高可用一主二从三哨兵集群并整合SpringBoot【图文完整版
    一、前言redis在我们企业级开发中是很常见的,但是单个redis不能保证我们的稳定使用,所以我们要建立一个集群。redis有两种高可用的方案:HighavailabilitywithRedisSen......
  • 深入理解Redis 数据结构—字典
    字典,又称为符号表、关联数组或映射,是一种用于保存键值对的抽象数据结构。在字典中,一个键可以和一个值进行关联,这些关联的键和值称为键值对。键值对中键是唯一的,我们可以......
  • 浅谈 Raft 分布式一致性协议|图解 Raft
    前言本篇文章将模拟一个KV数据读写服务,从提供单一节点读写服务,到结合分布式一致性协议(Raft)后,逐步扩展为一个分布式的,满足一致性读写需求的读写服务的过程。其中将配合引......
  • Redis学习(2)set和zset
    set集合底层就是一个hash表,只不过保存的值是null。添加删除saddkeyelementelement...用element等创建一个setsmemberskey显示key中成员sismemberskeyelemen......