一、场景
应用场景 秒杀、红包等高并发需要争抢服务器资源的时候,才需要使用
二、分布式锁的特性
互斥性: 任意时刻只有一个客户端持有锁
锁超时释放: 持有锁超时,可以释放锁,防止死锁
可重入性: 一个线程获取锁之后,可以再次请求对其加锁
高可用、高性能: 加锁和解锁的开销需要尽可能的低,同时也要保证高可用
安全性: 锁只能被持有它的客户端删除,不能被其他客户端删除
三、redis分布式锁的实现方式
忽略不可靠的版本:setnx + expire、setnx + value=expire。。。。。。
基本可用也是常用的 分布式锁实现方式:
set key uniqueval nx px expireTime
当删除key的时候,先要 get key 判断 val 是否是之前自己设置的 uniqueval
当然常用uedbet西甲体育投注也存在一定的缺陷,程序如果执行时间过长,而锁的过期时间过了的话,线程2就有可能会获得锁,并且执行
通常可以通过启动守护进程的形式,去不停的刷新锁的过期时间,知道a线程结束删除锁,或者 a 线程挂掉,不在做续期操作
四、redission
五、redlock
主要思想与实现方式即:
使用多台redis服务器,线程依次去申请redis的分布式锁,假设在规定的有效时间内,拥有半数以上的锁,即加锁成功,否则加锁失败。
六、并发情况下的大部分失败
使用自旋锁,即:在一定时间内,不断的进行分布式锁获取,直至超时返回失败
七、锁重入问题(感觉实际用到的地方比较少,更多的可能会用在底层的引用计数)
使用计数器原理,在递归的时候,可以对锁进行计数器迭代;直至计数器为0时,释放锁
八、锁的粒度
九、总结: