Redis实战14-分布式锁基本原理和不同实现方式对比

news2024/11/27 21:05:04

在上一篇文章中,我们知道了,当在集群环境下,synchronized关键字实现的JVM级别锁会失效的。那么怎么解决这个问题呢?我们可以使用分布式锁来解决。本文咱们就来介绍分布式锁基本原理以及不同实现方式对比。

我们先来回顾,JVM级别锁的时序图。如下图:

在集群下,不同jvm,就有多个锁监视器。那么,使用分布式锁应该是什么样的?我们可不可以把锁监视器提出来,放到一个三方组件中,集群中所以的JVM进程都可以共享访问到这个公共的锁监视器呢?如下图:

 

上图就是分布式锁的示意图。那么什么是分布式锁呢?

什么是分布式锁?

分布式锁需要满足分布式系统或者集群模式下多个进程可见并且互斥的锁。

分布式锁应该满足什么样的条件呢?

可见性

多个线程都能看到相同的结果,

注意:这个地方说的可见性并不是我们并发编程中指的内存的可见性。只是说多个进程之间都能够感知到变化的意思。

互斥

互斥是分布式锁的最基本的条件,使得程序串行执行

高可用

程序不容易崩溃,时时刻刻都保证较高的可用性

高性能

由于加锁本身就是让性能降低,所以对于分布式锁本身需要有较高的加锁性能和释放锁的性能

安全性

安全也是我们程序中必不可少的一个要素

常见的分布式锁有三种

Mysql实现分布式锁

mysql本身就带有锁机制,但是由于mysql性能本身一般,所以采用分布式锁的情况下,起始使用MySQL作为分布式锁比较少见;

Redis实现分布式锁

redis作为分布式锁是非常常见的一种使用方式,现在企业级开发中基本都是使用Redis或者zookeeper作为分布式锁。Redis实现分布式锁,利用的是setnx这个方法,如果插入key成功,则表示或得到了锁,如果有人插入成功,其他人插入失败则标识无法获取到锁,利用这套逻辑来实现分布式锁的。

Zookeeper实现分布式锁

zookeeper也是企业级开发中比较好的一个实现分布式锁的方案。主要使用到了临时有序节点和watch机制来实现的。本系列教程主要讲解Redis的,所以这里就不过多的阐述了。

我们来看看三种实现方式比较

我们从不同维度,对三种实现方式做了对比。如下图:

 

 下节预告:基于Redis实现分布式锁实现思路

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/607800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习】混合精度训练与显存分析

混合精度训练与显存分析 ​ 关于参数精度的介绍可以见文章https://zhuanlan.zhihu.com/p/604338403 相关博客 【深度学习】混合精度训练与显存分析 【深度学习】【分布式训练】Collective通信操作及Pytorch示例 【自然语言处理】【大模型】大语言模型BLOOM推理工具测试 【自然语…

(论文阅读)Chain-of-Thought Prompting Elicits Reasoningin Large Language Models

论文地址 https://openreview.net/pdf?id_VjQlMeSB_J 摘要 我们探索如何生成一个思维链——一系列中间推理步骤——如何显著提高大型语言模型执行复杂推理的能力。 特别是,我们展示了这种推理能力如何通过一种称为思维链提示的简单方法自然地出现在足够大的语言模…

2023 更新版:苏生不惑开发过的那些原创工具和脚本

苏生不惑第431 篇原创文章,将本公众号设为星标,第一时间看最新文章。 4年来苏生不惑这个公众号已经写了400多篇原创文章,去年分享过文章更新版:整理下苏生不惑开发过的那些工具和脚本 ,今年再更新下我开发过的原创工具…

【Python开发】FastAPI 07:Depends 依赖注入

在 FastAPI 中,Depends 是一个依赖注入系统,用于注入应用程序中所需的依赖项,通过 Depends,我们可以轻松地将依赖项注入到 FastAPI 路由函数中。简单来说,Depends 依赖注入的目的就是将代码重复最小! 目录 …

Vue学习3

文章目录 Vuex工作原理配置环境各种函数mapState对象写法数组写法 MapGetterMapMutations对象写法数组写法 Mapaction总结 模块化模块化1总结 Vuex 工作原理 那三个要通过store管理 配置环境 使用import时,回先执行Import中的代码,在后面的也会提前。 index.js…

Vscode利用ssh登录ubuntu开发环境下,代码不能跳转问题解决

0 开发环境 环境:VScode remote ssh 虚拟机Ubuntu22.04 1 问题记录 在win环境下,Vscode可以实现代码跳转。但是,在利用VScode的ssh登录Ubuntu下,代码不能进行跳转。 网上看到很多帖子,有的更改settings.json&…

【Ubuntu】保姆级图文介绍双系统win10卸载Ubuntu16.04

文章目录 删除Ubuntu分区数据删除Ubuntu启动项 这段时间想将前几年安装的Ubuntu16.04版本升级到Ubuntu20.04。 折腾了一番,升级失败了。想着还不如卸载了重新安装Ubuntu20.04。 由于Ubuntu16.04在升级过程中出现了一些问题,导致进不去Ubuntu系统。因此只…

tinkerCAD入门操作(2):移动、旋转和缩放对象

tinkerCAD入门操作:移动、旋转和缩放对象 介绍 现在您已经学会了如何在工作平面上旋转,是时候真正开始处理对象了。 在本课中,您将了解有关对象物理属性的更多信息。 放置一个盒子 我们需要一个对象来操作。让我们从一个盒子开始。在提示…

使用Druid数据源并查看监控页面

💧 使 用 D r u i d 数 据 源 并 查 看 监 控 信 息 \color{#FF1493}{使用Druid数据源并查看监控信息} 使用Druid数据源并查看监控信息💧 🌷 仰望天空,妳我亦是行人.✨ 🦄 个人主页——微风撞见云的博客&…

百度狂问3小时,大厂offer到手,小伙真狠!(百度面试真题)

前言: 在40岁老架构师尼恩的(50)读者社群中,经常有小伙伴,需要面试 百度、头条、美团、阿里、京东等大厂。 下面是一个小伙伴成功拿到通过了百度三次技术面试,小伙伴通过三个多小时技术拷问,最…

Docker镜像存储

前言 在之前的文章中有说过容器目录的隔离机制. 今天来分析一下镜像的文件系统. Docker 已经用了很久了, 也知道镜像存储的时候是分层存储的(从docker pull时分层下载就能看出), 但是具体是如何将多层进行聚合并生成最终展示的文件, 这个过程从未深究过. 既然不知道, 又难掩好…

chatgpt赋能python:Python反向切片:介绍与例子

Python反向切片:介绍与例子 Python是一种高级编程语言,具有简单易懂的语法和高效的运行速度,以及丰富的标准库和第三方库。其中一项有趣的功能是Python反向切片,它能够用一种简单而有效的方式处理列表(list&#xff0…

大模型有什么用,从技术上看

一、大模型有什么用 目前为止,大模型主要是以NLP为主,因为NLP抛弃了RNN序列依赖的问题,采用了Attention is All you need的Transformer结构,使得NLP能够演变出更多大模型。图像领域也不甘示弱,CNN大模型也开始陆续涌现…

tcpdump命令抓取网络数据包并用wireshark软件分析

1、tcpdump命令部署 1.1、源码下载 (1)下载网址:http://www.tcpdump.org; (2)下载匹配的libpcap库和tcpdump库; (3)编译tcpdump命令依赖libpcap库,所以要先编译libpcap库再编译tcpdump命令; 1.2、源码编译 1.2.1、编…

chatgpt赋能python:Python如何去掉空值

Python如何去掉空值 数据处理过程中经常会出现空值,这些空值可以影响我们对数据的分析和处理。在Python中,有许多方法可以去除空值。本文将介绍常见的方法并提供实例说明。 什么是空值 在Python中,空值通常用None或NaN表示。None是Python内…

FutureTask简介

FutureTask简介 Future接口和实现Future接口的FutureTask类,代表异步计算的结果。FutureTask除了实现Future接口外,还实现了Runnable接口。因此,FutureTask可以交给Executor执行,也可以由调用线程直接执行(FutureTask…

华为OD机试真题 Java 实现【矩阵最大值】【2023 B卷 100分】,附详细解题思路

一、题目描述 给定一个仅包含0和1的N*N的二维矩阵,请计算二维矩阵的最大值。 计算规则如下: 1、每行元素按下标顺序组成一个二进制数(下标越大越排在低位),二进制数的值就是该行的值。矩阵各行值之和为矩阵的值。 …

使用Windbg动态调试目标进程的一般步骤及相关要点详解

目录 1、概述 2、将Windbg附加到已经启动起来的目标进程上,或者用Windbg启动目标程序 2.1、将Windbg附加到已经启动起来的目标进程上 2.2、用Windbg启动目标程序 2.3、Windbg关联到目标进程上会中断下来,输入g命令将该中断跳过去 3、分析实例说明 …

ModuleNotFoundError: No module named ‘transformers_modules.chatglm-6b_v1‘的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

ggplot2、RMySQL、httpuv、shiny、miniUI、devtools、recharts安装问题

目录 ggplot2下载成功! RMySQL下载成功! automake-1.16.tar.gz下载成功! httpuv下载成功! shiny下载成功! miniUI下载成功! devtools下载成功! recharts下载成功! 首先的首先…