当前位置: 首页 > news >正文

分布式锁如何实现

分布式是现在的比较主流的技术,常常和微服务一起出现。那么对于多个实例之间,如何证分布式系统中多个进程或线程同步访问共享资源呢?我们其实一想到的就是锁,我们在java里边有 synchronized, 在python里有lock,但是这个只能到证在单机的时候不会出现线程安全问题,但是在分布式的环境下,这种方式就没有任何的作用了。shigen在实习的时候就遇到了这样的问题,最开始还不知道分布式锁。但是今天,这篇文章将会带你读懂分布式锁和它的实现方式。

题外话

先来题外话引入今天的话题哈,现在的面试,八股文总会提到超卖问题怎么解决,恰恰在昨天下班的时候看到了这样的一篇文章。背景我也不想去研究了,毕竟咱也不是重度的吃瓜群众,比较吸引我的事超额超卖问题。当时不由得一惊:擦,这不就是面试经常问的问题吗?要是同行写出的程序问题,这不得去祭天。

超额超卖新闻

吓得我赶紧回来研究一下分布式锁。

分布式锁

概念是这样的:分布式锁是一种用于保证分布式系统中多个进程或线程同步访问共享资源的技术

同我们认识的synchronized锁和其它的lock锁一样,分布式锁也是有要求的:

分布式锁要求
  1. 互斥性:在任意时刻只能有一个客户端持有锁。
  2. 不会发生死锁:即使持有锁的客户端发生故障,也能保证锁最终会被释放。
  3. 具有容错性:分布式锁需要能够容忍节点故障等异常情况,保证系统的稳定性。
实现方案

1.基于数据库实现的分布式锁

可以通过数据库的乐观锁或悲观锁实现分布式锁,但是由于数据库的操作比较慢,不适合高并发场景。

2.基于 ZooKeeper 实现的分布式锁

ZooKeeper 是一个高可用性的分布式协调服务,以前在微服务中也作为注册中心使用,是CP的。可以通过它来实现分布式锁。但是使用 ZooKeeper 需要部署额外的服务,增加了系统复杂度。所以,shigen也很少使用这个。

3.基于 Redis 实现的分布式锁

Redis支持分布式部署,可以通过Redis的原子操作实现分布式锁,而且具有高性能和高可用性。

具体实现

mysql

这里需要注意:不要小瞧了数据库,数据库可以实现悲观锁和乐观锁

悲观锁

悲观锁的概念可以理解为:不管是谁来操作数据,我都要上一把锁!

乐观锁

其实就是在数据修改的时候加上一个版本号,我们在修改的时候加上版本号作为去修改的条件。这一点shigen是使用elasticSearch的时候也遇到过。

其实这样看起来,mysql实现分布式锁还是比较简单的。但是你想想,都上分布式了,肯定对性能上有要求。这样的操作,DB上的压力很大,mysql需要不断的从磁盘中加载数据到内存中,性能上的提升不是很明显的。

zookeeper

实现稍微的复杂,这里不讲,目前也没有接触到这样的项目。不过它在CAP理论中是CP理论,对于数据的一致性要求高的可以考虑采取它作为解决方案。

redis

最后讲一下给予内存的数据库redis,提到redis,就不得不提到redLock,俗称的红锁。我们在Spring boot的项目中配置好redisson即可使用。

其实写法上和Java的lock锁差不多,都有获得锁、释放锁的过程。

总结

在文章的最后我们来一波小总结, 即:Redis VS Zookeeper。

Redis 和 ZooKeeper 都可以用来实现分布式锁,它们在实现分布式锁的机制和原理上有所不同,具体区别如下:

  1. 数据存储方式:Redis 将锁信息存储在内存中,而 ZooKeeper 将锁信息存储在 ZooKeeper 的节点上,占用的是磁盘的空间。
  2. 锁的释放:Redis 的锁是通过设置锁的过期时间来自动释放的,而 ZooKeeper 的锁需要手动释放,如果锁的持有者出现宕机或网络中断等情况,需要等待锁的超时时间才能自动释放。
  3. 锁的竞争机制:Redis 使用的是单机锁,即所有请求都直接连接到同一台 Redis 服务器,容易发生单点故障;而 ZooKeeper 使用的是分布式锁,即所有请求都连接到 ZooKeeper 集群,具有较好的可用性和可扩展性——集群的优势。
  4. 一致性:Redis 的锁是非严格意义下的分布式锁,因为在多台机器上运行多个进程时,由于 Redis 的主从同步可能会存在数据不一致的问题;而 ZooKeeper 是强一致性的分布式系统,保证了数据的一致性。
  5. 性能:Redis 的性能比 ZooKeeper 更高,数据的存储位置不同,一个是内存,另一个是在磁盘中。

总之,Redis 适合实现简单的分布式锁场景,而 ZooKeeper 适合实现复杂的分布式协调场景,也就是 ZooKeeper 适合强一致性的分布式系统。具体场景具体的分析。


以上就是《分布式锁如何实现》的全部内容了,觉得不错的话,记得点赞支持一下哈!

shigen一起,每天不一样!

http://www.lryc.cn/news/186633.html

相关文章:

  • Mysql存储-EAV模式
  • 全局变量报错:\Output\STM32.axf: Error: L6218E: Undefined symbol
  • 算法错题簿(持续更新)
  • 基于Springboot实现疫情网课管理系统项目【项目源码+论文说明】
  • Linux文件与目录的增删改查
  • JVM的内存模型
  • 数据采集项目之业务数据(三)
  • vuedraggable影响点击事件的解决办法
  • Linux 中的 grep 命令
  • 阶段五-Day03-Ajax
  • EPOLL单线程版本 基于reactor 的 httpserver文件下载 支持多个客户端同时处理
  • uniapp实现微信小程序隐私协议组件封装
  • 【Node.js】NPM 和 package.json
  • 周总结【java项目】
  • 《深度不确定条件下的决策:从理论到实践》PDF
  • 【MySQL】表的基础增删改查
  • 第11章 Redis(二)
  • mybatis配置entity下不同文件夹同类型名称的多个类型时启动springboot项目出现TypeException源码分析
  • 淘宝商品评论数据分析接口,淘宝商品评论接口
  • RK3288 android7.1 修改双屏异触usb tp触摸方向
  • 软考 系统架构设计师系列知识点之软件架构风格(8)
  • ubuntu安装ssh
  • webpack不同环境下使用CSS分离插件mini-css-extract-plugin
  • [MongoDB]-权限验证管理
  • bootstrapjs开发环境搭建
  • 远程实时监控管理:5G物联网技术助力配电站管理
  • ubuntu 23.04安装中文输入法
  • java:解析json的几种方式
  • pytorch_神经网络构建1
  • Android 多线程并发详解