您当前的位置: 首页 >  redis

java持续实践

暂无认证

  • 2浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Redis实现分布式锁原理 详解

java持续实践 发布时间:2021-05-29 21:55:54 ,浏览量:2

笔记来源: Java工程师面试突击专栏 https://apppukyptrl1086.pc.xiaoe-tech.com/detail/p_5d3114935b4d7_CEcL8yMS/6

文章目录
      • Redis分布式锁 上锁
      • Redis分布式锁 释放锁
      • 单机Redis与主从架构实现分布式锁的缺点

Redis分布式锁 上锁

Redis 实现分布式锁, 官方叫做RedLock .

Redis 实现分布式锁命令: SET my:lock 随机值 NX PX 30000 my:lock 为key value 为随机值.

NX 的含义

  1. 如果此时Redis中没有要设置的key , 那么返回ok
  2. 如果存在了key , 那么设置该key失败, 返回nil.

PX的含义 后面的数字为时间,单位为毫秒, PX 30000 代表过了30秒后, key自动过期 , 自动被删除.

其他的线程, 如果没有抢到这把锁(即Redis返回的是nil), 那么会每隔一段时间, 例如1s去尝试获取这把锁.

Redis分布式锁 释放锁

释放锁, 删除key , 一般可以用lua脚本去删除, 需要判断value一样才删除.

例如如下的lua脚本 , 判断值, 如果一致, 则执行删除.

if redis.call("get",KEYS[1]) == ARGV[1] then
return redis.call("del",KEYS[1])
else
    return 0
end

这段lua脚本作用是把key的value 与 传递过去的value 进行比较, 如果一致, 才会进行删除, 如果不一致就不会进行删除.

需要判断value 一致才进行删除的原因: 在上锁的时候, 会在PX 参数后设置一个值, 代表该key过期时间, 假如说某个线程A执行上锁的时间超过了PX 设置的时间值, 这个时候redis 已经把这个key删除了, 另外一个线程B就会获取了锁, 但过了一会后, 线程A执行完业务代码了, 在最后要去删除key ,假如不判断value,直接删除, 则会把线程B的锁给删除. 后果就是把别人的锁给删除了.

如果加上要比较value的逻辑, 那么在线程A 执行完逻辑后, 要删除key ,但发现此时通过key获取的value不是比较的值, 那么就不能删除.

单机Redis与主从架构实现分布式锁的缺点
  1. 只有单机Redis, 如果此Redis挂了, 那么整个分布式锁的协调也就失效了.
  2. 如果是主从架构, 由于master和slave 节点数据复制是异步, 如果主节点的redis 挂了, 还没有来得及同步给从节点, 那么此时也会导致分布式锁的协调失效
关注
打赏
1658054974
查看更多评论
立即登录/注册

微信扫码登录

0.0383s