为什么需要分布式锁
- 锁能保证多线程环境下对同一份资源竞争的数据安全性
- 分布式锁是 用于保证集群内多台机器的多线程并发线程安全的一种手段。
分布式锁的特征
- 高性能:不能影响主要的业务,只是为了安全的一种手段。
- 可重入:可重入的条件就是持有锁的线程就是当前请求的线程,重入几次就释放几次。
- 防止死锁:不能永远加锁。比如有超时时间和自动超时。
- 互斥性:锁就是要保证这一点。
高性能要求了不能每次都从磁盘上拿数据,锁要存放在内存中(当然会带来高可用的问题),所以业内比较成熟的是redis和zk来做分布式锁。
可重入的实现需要记录当前threadId的重入次数,获取锁时如果锁存在就判断是不是当前线程,如果是的话只需要给重入数+1。不是当前线程相当于没有获取到锁。
防止死锁:锁加超时时间,避免死锁。
分布式锁的实现
- Mysql
- redis
- zk
分布式锁的应用
- 防止缓存击穿。如果击穿瞬间不加锁,则可能打垮数据库,在缓存击穿查询数据库的时候加分布式锁,查出来放入缓存,之后的大批请求就会命中缓存,这里能防缓存击穿。
- 保证接口幂等。防止重复提交,添加分布式锁排队请求,第二次在获取到锁之后加入判断幂等的逻辑。
- 防止超卖等场景
- 任务调度。如果没有分布式调度工具,需要保证集群中执行任务的就只有一台。