秒杀场景:
优化一:
负载均衡 分布式部署
nginx和Java的springboot gateway 网关
问题:
Java中的锁,只能锁住一个线程,对于分布式情况下,每台服务器都会有一个锁,因为锁是jvm级别的
优化二:
redis分布式锁
通过redis的SetNX实现分布式锁
如果锁住某个key,就会返回true,没锁上就返回false
问题:
用户在请求过程中,如果用户所处的服务器挂掉,那么分布式锁,无法解锁
导致其他请求来,给该key上锁,无法上锁,出现死锁
解决:
给分布式锁设置过期时间
新问题:
如果业务时间长,锁提前释放 ,又会造成超卖的问题
优化三:
1.给锁加长时间,并添加子线程每10秒确认线程是否在线,在线则将过期时间重设
2.给锁加唯一id(uuid)解决处理完释放其他线程的锁的情况
重点:以上优化可以用redis组件redisson来解决实现分布式锁
redisson原理:

问题:
如果redis使用的是 主从复制的模式,有主节点和从节点,设置锁时 只能给主节点设置
如果给主节点设置锁,这时如果主节点突然宕机了,从节点没有同步到这把锁,这是又会出现超卖问题
解决方案:
redisson有一个read lock
保证所有你提供的节点都存储完毕,才相应锁成功