Redis分布式锁
分布式锁使用的场景
集群情况下的定时任务,抢单,幂等性等场景
抢券场景
查询库存 -> 扣减库存
多个并发线程同时查询库存,出现超卖问题
添加互斥锁
所有线程执行操作之前必须尝试获取锁
保证一次只有一个线程能走查询库存->扣减库存的流程
Redis分布式锁实现原理
主要利用Redis的setnx(set if not exist)命令
redis
set lock value nx ex 10
//获取锁
//设置过期时间防止获取锁时业务超时或服务宕机
redis
del key
//释放锁
合理控制锁的有效时长
根据业务执行时间预估
加长锁的过期时间
给锁续期
使用redisson实现的分布式锁,基于setnx命令
watch dog
监控线程,监听持有锁的线程
加锁成功后每隔releaseTime/3的时间做一次续期
释放锁后通知watchdog
Redisson的获取锁方式
如果没有获取锁成功,会循环不断尝试获取锁直到超时
提高了分布式锁的可用性
Redisson实现的分布式锁--可重入
判断是否是同一个线程获取锁,如果是就可以成功获取
利用hash结构记录线程id和重入次数
key->线程名->重入次数
释放锁时会使锁的重入次数减一
Redisson实现分布式锁的主从一致性
RedLock:(实现繁琐,性能差)
在多个redis实例上创建锁(n/2+1)
n为redis节点数量
即超过redis实例的一半加锁