redis分布式锁
By skyshappiness Posted 2022-11-20 17:35:28 In

一、场景

       应用场景 秒杀、红包等高并发需要争抢服务器资源的时候,才需要使用


二、分布式锁的特性

       互斥性:               任意时刻只有一个客户端持有锁

       锁超时释放:         持有锁超时,可以释放锁,防止死锁

       可重入性:            一个线程获取锁之后,可以再次请求对其加锁

       高可用、高性能:  加锁和解锁的开销需要尽可能的低,同时也要保证高可用

       安全性:               锁只能被持有它的客户端删除,不能被其他客户端删除


三、redis分布式锁的实现方式

  忽略不可靠的版本:setnx + expire、setnx + value=expire。。。。。。

  基本可用也是常用的 分布式锁实现方式:

      set key uniqueval nx px expireTime

      当删除key的时候,先要 get key 判断 val 是否是之前自己设置的   uniqueval

  当然常用指令也存在一定的缺陷,程序如果执行时间过长,而锁的过期时间过了的话,线程2就有可能会获得锁,并且执行

  通常可以通过启动守护进程的形式,去不停的刷新锁的过期时间,知道a线程结束删除锁,或者 a 线程挂掉,不在做续期操作

  

四、redission


五、redlock  

      主要思想与实现方式即:

           使用多台redis服务器,线程依次去申请redis的分布式锁,假设在规定的有效时间内,拥有半数以上的锁,即加锁成功,否则加锁失败。


六、并发情况下的大部分失败

       使用自旋锁,即:在一定时间内,不断的进行分布式锁获取,直至超时返回失败


七、锁重入问题(感觉实际用到的地方比较少,更多的可能会用在底层的引用计数)

       使用计数器原理,在递归的时候,可以对锁进行计数器迭代;直至计数器为0时,释放锁


八、锁的粒度


九、总结:

友情链接
联系方式
  • 邮箱 / E-mail:121388038@qq.com