分布式锁的过期时间设置多长合适_redis面试必备!3种实现分布式锁的方法你会几种?...

原创文章首发微信公众号「后端技术学堂」转载请先与我联系,点文末链接「了解更多

2b823fc0ecaf196c8cf07f202f91cd11.png

今天就来说说高并发编程中redis分布式锁实现,这里罗列出3种redis实现的分布式锁,并分别对比说明各自特点。

Redis单实例分布式锁

实现一:SETNX实现的分布式锁

setnx用法参考redis官方文档

语法

SETNX key value

将key设置值为value,如果key不存在,这种情况下等同SET命令。当key存在时,什么也不做。SETNX是”SET if Not eXists”的简写。

返回值:

  • 1 设置key成功
  • 0 设置key失败
加锁步骤
  1. SETNX lock.foo 如果客户端获得锁,SETNX返回1,加锁成功。如果SETNX返回0,那么该键已经被其他的客户端锁定。
  2. 接上一步,SETNX返回0加锁失败,此时,调用GET lock.foo获取时间戳检查该锁是否已经过期:
  3. 若旧的时间戳已过期,则表示加锁成功。
  4. 若旧的时间戳还未过期(说明被其他客户端抢去并设置了时间戳),代表加锁失败,需要等待重试。
  5. 如果没有过期,则休眠一会重试。
  6. 如果已经过期,则可以获取该锁。具体的:调用GETSET lock.foo 基于当前时间设置新的过期时间。注意: 这里设置的时候因为在SETNX与GETSET之间有个窗口期,在这期间锁可能已被其他客户端抢去,所以这里需要判断GETSET的返回值,它的返回值是SET之前旧的时间戳:
解锁步骤

解锁相对简单,只需GET lock.foo时间戳,判断是否过期,过期就调用删除DEL lock.foo

实现二:SET实现的分布式锁

set用法参考官方文档

语法

SET key value [EX seconds|PX milliseconds] [NX|XX]

将键key设定为指定的“字符串”值。如果 key

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值