自学八股:分布式锁基础

前置知识

分布式系统,一个后端服务会与多个客户端进行连接,所以会有负载均衡,多线程和异步这些情况 由于SpringBoot项目中内置Tomcat,所以处理一般都是多线程的

主要在项目的任务领取功能的部分使用了分布式锁

  • 在分布式系统中,分布式锁 是一种用于协调多个进程或线程对共享资源访问的机制。它主要用于解决在高并发场景下对共享资源的竞争问题,确保在任意时刻只有一个客户端可以操作共享资源。
  • 在分布式系统中,某些任务可能需要确保在任意时刻只有一个实例在运行。分布式锁可以防止多个实例同时执行相同的任务。
  • 在分布式系统中,多个客户端可能会同时对数据库或缓存进行写操作。如果没有适当的同步机制,可能会导致数据不一致。 在某些场景下,需要确保在读取和写入共享资源时的原子性。分布式锁可以防止多个客户端同时进行读写操作,从而保证数据的一致性。
  • 在分布式系统中,多个客户端可能会同时对共享数据进行操作。如果没有适当的同步机制,可能会导致数据竞争,从而导致数据不一致。

这个项目为什么要使用分布式锁:防止任务超领;

ps: 要区分线程锁和分布式锁,像java中实现的synchronized和Lock,线程锁本质是基于线程之间的共享内存实现的

实际使用

分布式锁的核心就是大家共用一把锁,这样就可以锁住线程,不让线程进行,让程序串行化执行,在实际中通过Mysql,Redis,Zookpeer都可以,但是在项目中主要使用的是用Redis实现分布式锁,所以这里主要探讨利用Redis实现分布式锁

1,基于SETNX实现分布式锁

获取锁:

  • 互斥 :每次只能有一个线程获得锁
  • 非阻塞:尝试一次,成功返回true,失败返回false 释放锁:
  • 手动释放
  • 超时释放
  • 保证故障的时候依然可以释放锁,避免出现死锁

这个实现的锁可以基于lua脚本进行进一步的改进,保证锁的原子性,并负担解锁的任务

2,基于RedLcok实现分布式锁

假设有两个服务A、B都希望获得锁,有一个包含了5个redis master的Redis Cluster,执行过程大致如下:

  1. 客户端获取当前时间戳,单位: 毫秒
  2. 服务A轮寻每个master节点,尝试创建锁。(这里锁的过期时间比较短,一般就几十毫秒) RedLock算法会尝试在大多数节点上分别创建锁,假如节点总数为n,那么大多数节点指的是n/2+1。
  3. 客户端计算成功建立完锁的时间,如果建锁时间小于超时时间,就可以判定锁创建成功。如果锁创建失败,则依次(遍历master节点)删除锁。
  4. 只要有其它服务创建过分布式锁,那么当前服务就必须轮寻尝试获取锁。

3,基于Redission实现

优势:

  1. redission的所有指令都是基于lua脚本实现,保证了操作的原子性
  2. redission设置了watchdog看门狗,看门狗的逻辑保证了没有死锁发生
  3. redisson支持RedLock的实现方式

如何使用

  1. 线程去获取锁,获取成功: 执行lua脚本,保存数据到redis数据库。
  2. 线程去获取锁,获取失败: 订阅了解锁消息,然后再尝试获取锁,获取成功后,执行lua脚本,保存数据到redis数据库

互斥,可重入,watch dog后面再具体说

总结:

这就是一些分布式锁的基础知识,之前面试的时候,面试官问这里问的非常多,但是当时没太懂,甚至把分布式锁说成了线程锁(哈哈)

相关推荐
余槐i4 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
需要8264 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
凤山老林5 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
伯恩bourne6 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
张彦峰ZYF7 小时前
停顿短不等于延迟低:G1、ZGC 与低延迟服务的目标分野、代价账本与选型标定
后端·回收暂停、应用停止总时长·到达安全点、分配停滞·屏障吃吞吐、并发线程吃核心·并发窗口吃堆余量·分区式靠挑回收集兑现目标·染色指针式不支持压缩引用
pride.li7 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
upala8 小时前
【仓颉语言入门 · 第二篇 第 6 课】
后端
罗丹丹Luna8 小时前
移动端显示“已提交”以后:SAP 与低代码集成该怎样暴露真实状态
后端·架构
码事漫谈8 小时前
因为太想讨好你,所以AI会骗你
后端
吴凡wudianmei8 小时前
每调一次模型都花钱?如何用工程手段把调用压到最少?
前端·后端·架构