目录
秒杀案例
我们来看一个秒杀小案例,每有一个用户下单库存就-1 ,在单环境部署情况下,我们添加了synchronized锁,锁住扣除库存代码块,这样不会出现多线程并发导致库存数量出现重复或负数问题。
但分布式部署,synchronized就无法解决此问题了,多个项目就有多个synchronized锁,锁之间会覆盖冲突,导致库存数量无法onebyone的减少,直至清空。
我们需要想一个策略,在分布式环境下共用一把锁,保证无论同时请求多少,库存都在一件一件扣,直到扣完为止~
分布式锁应具备的条件
多个机器在同一时间只让一个机器的一个线程执行
高性能、高可用的获取锁和释放锁
具备锁失效机制,防止死锁
具备非阻塞,没有获取到锁将直接返回获取失败
三种方案的分布式锁
分布式锁是控制分布式系统之间同步访问共享资源的一种方式。分布式锁常用的实现方式有三种:
基于数据库实现分布式锁、基于缓存实现分布式锁、基于Zookeeper实现分布式锁
三种方式都有一个前提:必须都是集群架构~
注意:分布式锁也同样存在CAP问题,因此具体使用哪种方案要综合考虑实际需求
基于数据库实现分布式锁
基于数据库其实很简单,我们直接用乐观锁就可以。这里有一篇乐观锁应用可参考