redis----- 分布式锁

redis实现分布式锁

1.原生redis实现

2基于redisson实现

1基于原生redis实现

1.1redis的 命令Setnx+lua命令来实现

   1. setnx key value  #获取锁  要做唯一判断

   2.lua脚本实现key的过期,从而保证原子性

   if redis.call("get",KEYS[1])==ARGV[1] then

   retrun redis.call("del",KEYS[1])

    else

    return 0

    end

1.2 redis的set命令实现

在Redis 2.6.12 之后,对set进行了升级,通过新的set命令能够实现 setnx命令和psetex 

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

官网解释链接:http://redisdoc.com/string/set.html

  • EX seconds : 将键的过期时间设置为 seconds 秒。 执行 SET key value EX seconds 的效果等同于执行 SETEX key seconds value 。
  • PX milliseconds : 将键的过期时间设置为 milliseconds 毫秒。 执行 SET key value PX milliseconds 的效果等同于执行 PSETEX key milliseconds value 。
  • NX : 只在键不存在时, 才对键进行设置操作。 执行 SET key value NX 的效果等同于执行 SETNX key value 。
  • XX : 只在键已经存在时, 才对键进行设置操作

通过这个命令就可以很好的设置锁和锁的过期时间,而且还是原子性

  1. set命令要用 set key value px milliseconds nx 设置锁的过期时间,防止死锁出现

  2. value要具有唯一性;

  3. 释放锁时要验证value值,不能误解锁;

 这个实现存在的一些问题

   1.redis 在线程没有执行完的情况下,key到期 锁失效,会发生多线程对一个方法操作

      解决方案:锁续命:  在线程获取锁的时候,为获取当前锁的线程,在开启一个守护线程,用来给锁进行续命,从而解决锁的 到期时间

  2.线程一直运行,一直续命会不会导致线程阻塞

    解决思路:程序一直运行,锁线程肯定会一直续命,这里我们可以给锁续命,增加续命上限,但续命次数到达上线之后,就

3.在Redis的master节点上拿到了锁,但是这个加锁的key还没有同步到slave节点,master故障,发生故障转移,slave节点升级为master节点,导致锁丢失。

2.通过redission来实现分布式锁

redisson 是很好的解决分布式锁的一个问题

  • RLock lock = redisson.getLock(UUID.randomUUID().toString());  #获取锁
    
  •  lock.tryLock(); # 加锁  这是默认的设置30秒 过期
  •  lock.tryLock(long time, TimeUnit unit)  #根据自己的逻辑来设置过期时间
  •  lock.unlock(); # 解锁 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值