Fork me on GitHub

分布式锁基础

为什么需要分布式锁

  • 锁能保证多线程环境下对同一份资源竞争的数据安全性
  • 分布式锁是 用于保证集群内多台机器的多线程并发线程安全的一种手段。

分布式锁的特征

  • 高性能:不能影响主要的业务,只是为了安全的一种手段。
  • 可重入:可重入的条件就是持有锁的线程就是当前请求的线程,重入几次就释放几次。
  • 防止死锁:不能永远加锁。比如有超时时间和自动超时。
  • 互斥性:锁就是要保证这一点。

高性能要求了不能每次都从磁盘上拿数据,锁要存放在内存中(当然会带来高可用的问题),所以业内比较成熟的是redis和zk来做分布式锁。

可重入的实现需要记录当前threadId的重入次数,获取锁时如果锁存在就判断是不是当前线程,如果是的话只需要给重入数+1。不是当前线程相当于没有获取到锁。

防止死锁:锁加超时时间,避免死锁。

分布式锁的实现

  • Mysql
  • redis
  • zk

分布式锁的应用

  • 防止缓存击穿。如果击穿瞬间不加锁,则可能打垮数据库,在缓存击穿查询数据库的时候加分布式锁,查出来放入缓存,之后的大批请求就会命中缓存,这里能防缓存击穿。
  • 保证接口幂等。防止重复提交,添加分布式锁排队请求,第二次在获取到锁之后加入判断幂等的逻辑。
  • 防止超卖等场景
  • 任务调度。如果没有分布式调度工具,需要保证集群中执行任务的就只有一台。
-------------本文结束感谢您的阅读-------------

本文标题:分布式锁基础

文章作者:夸克

发布时间:2021年07月11日 - 07:07

最后更新:2022年07月01日 - 07:07

原始链接:https://zhanglijun1217.github.io/2021/07/11/分布式锁基础/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。