论Redis 7种加锁方式的优缺点

本文参考文章《论Redis分布式锁的正确使用姿势》总结一下文中提到的7种加锁方式的优缺点。
方案一:SETNX + EXPIRE
优点:实现简单,通过修改过期时间可以支持锁重入,锁超时自动释放;
缺点:因为上述命令是分两步执行,如果第二步执行失败,将造成无法解锁。
方案二:SETNX + value值是(系统时间+过期时间)
优点:加锁是原子操作,解决了方案一的缺点。
缺点:实现复杂,每个机器的时间必须保持同步,其他加锁线程会修改过期时间,锁有可能被其他线程错误释放。
方案三:使用Lua脚本(包含SETNX + EXPIRE两条指令)
优点:保证加锁和解锁的原子性。
缺点:无法支持锁的重入,主从模式可能造成锁丢失,锁无法自动续期。
方案四:SET的扩展命令(SET EX PX NX)
优点:保证加锁和解锁的原子性。
缺点:锁有可能被其他线程错误释放,锁没有自动续期机制,锁无法支持重入。
方案五:SET EX PX NX + 校验唯一随机值,再释放锁
优点:保证加锁的原子性,使用LUA释放锁的话,锁不会被其他线程错误释放。
缺点:锁没有自动续期机制,锁无法支持重入。
方案六: 开源框架:Redisson
优点:锁支持自动续期。
缺点:主从模式可能造成锁丢失。
方案七:多机实现的分布式锁Redlock
优点:锁支持自动续期,解决了方案六的缺点。
缺点:需要部署多台redis机器,极端情况下,会造成两个线程同时获得锁。为了避免该种情况发生,要求宕机的redis在超过锁超时时间后再重启。使用锁的时间要小于锁超时时间。

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Redis分布式锁中,加锁失败会有不同的处理方式。根据引用和引用的描述,当加锁失败时,通常会返回当前已经加锁的线程还有多久到期的信息。然后,线程会休眠一段指定的时间后再次尝试加锁。 具体来说,对于RedissonLock,如果加锁失败,返回的过期时间(ttl)表示当前锁还有多久过期。例如,如果锁还有4秒过期,那么ttl就是4秒。而对于RedLock,在获取过期时间(ttl)时,会考虑剩余的等待时间(waitTime)。如果锁还有4秒过期,但是等待时间只剩下3秒,那么ttl就是3秒;反之,如果等待时间还有5秒,但是锁还有3秒就过期,那么ttl也是3秒。这是根据引用的描述。 总之,加锁失败后的处理方式可以根据具体的实现和需求进行调整,但通常会使用线程休眠和重新尝试加锁的策略来处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Redis分布式锁加锁失败,休眠机制](https://blog.csdn.net/CPLASF_/article/details/123953842)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [谈谈Redis分布式锁的正确实现方法](https://download.csdn.net/download/weixin_38745648/13703862)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值