基于数据库(MySQL)与缓存(Redis)实现分布式锁
分布式锁
分布式锁:分布式锁是在分布式的情况下实现互斥类型的一种锁
实现分布式锁需要满足的五个条件
- 可见性:多个进程都能看到结果
- 互斥性:只允许一个持有锁的对象的进入临界资源
- 可用性:无论何时都要保证锁服务的可用性(集群模式)
- 锁超时(死锁问题):允许持锁对象持锁最长时间,客户端一定可以获得锁
- 脑裂问题:集群同步时产生数据不一致,导致新的进程有可能拿到锁,但之前的进程以为自己还有锁,就出现了两个进程拿到了同一个锁的问题
基于数据库实现分布式锁
基于防重表(表记录)实现
- 创建锁表,内部存在字段表示资源名及资源描述,同一资源名使用数据库唯一性限制。
- 多个进程同时往数据库锁表中写入对某个资源的占有记录,当某个进程成功写入时则表示其获取锁成功。
- 其他进程由于资源字段唯一性限制插入失败陷入自旋并且失败重试。
- 当执行完业务后持有该锁的进程则删除该表内的记录,此时回到步骤一。
注意事项
- 当某进程持有锁并且挂死时候会造成资源一直不释放,造成死锁,因为需要维护一个time字段,定时清理任务去清理持有过久的锁
- 要设置为可重入模式,可以添加持有锁的进程的信息以及加锁的次数
基于悲观锁实现
- 关闭自动commmit属性
- 每次执行业务前使用查询语句后接for update锁定该行的数据
- 执行业务流程
- 提交commit
注意事项
- 并发量很高的情况下,影响系统的可用性
基于乐观锁实现
表里面冗余一个版本号字段
- 每次执行业务前首先进行数据库查询,查询当前的需要修改的资源的版本号
- 进行资源的修改操作,但会比较一下当前数据的版本号与操作1中的版本号是否相同
- 如果相同修改资源,否则返回第一步
注意事项
- 并发量很高的情况下,会对数据库造成很大的压力,同时并发不是很高
- 对业务具有侵入性,设置版本号会增加数据库冗余
基于分布式缓存实现分布式锁
基于分布式缓存实现分布式锁,这个大多数都是依靠redis来进行实现的,所以我们也以redis来进行举例
使用set命令然后在这个命令后加一些参数来实现一个原子命令来设置对应过期时间或者使用lua脚本来实现这个功能
SET key value[EX seconds][PX milliseconds][NX|XX]
但是存在问题:
- 锁过期了,但是业务还没有执行完
- 锁被其他线程给误删了
避免被误删
对于value设置一个当前进程唯一的随机值
同时为了一个保证判断当前值是否一致以及删除键的操作是唯一的,那么就会使用到lua脚本
在Redis中,Lua脚本能够保证原子性的主要原因还是Redis采用了单线程执行模型。也就是说,当Redis执行Lua脚本时,Redis会把Lua脚本作为一个整体并把它当作一个任务加入到一个队列中,然后单线程按照队列的顺序依次执行这些任务,在执行过程中Lua脚本是不会被其他命令或请求打断,因此可以保证每个任务的执行都是原子性的。
锁续期机制
在redisson中有一个看门狗机制,相当于有一个后台线程,每隔10s都会检测一下,如果线程还持有锁,那么就会不断延长key的生存时间
RedLock
在企业里面大多数都是基于redis集群的状态,不会是单个节点,所以确保每个节点上都加上锁才是真正的加锁成功
RedLock:搞多个Redis master部署,以保证它们不会同时宕掉。并且这些master节点是完全相互独立的,相互之间不存在数据同步。同时,需要确保在这多个master实例上,是与在Redis单实例,使用相同方法来获取和释放锁。
- 获取当前时间,以毫秒为单位
- 按顺序像五个节点请求加锁。客户端设置网络连接和响应超时时间,并且超时时间要小于锁的失效时间
- 用当前时间减去步骤1的时间,得到获取锁使用的时间,当且仅当超过一半的节点都获取到锁并且使用时间小于锁失效时间,锁才算获取成功
- 如果不满足步骤3则就是加锁失败,同时释放刚才的锁
实现锁重入
如果想实现可重入功能,那么可以使用redis里面的hash的数据结构,然后使用lua脚本来设置具体的值,具体要使用到的三个值就是下面的这三个命令
hset [name] [key] [value]
hincrby
expire
相关文章:

基于数据库(MySQL)与缓存(Redis)实现分布式锁
分布式锁 分布式锁:分布式锁是在分布式的情况下实现互斥类型的一种锁 实现分布式锁需要满足的五个条件 可见性:多个进程都能看到结果互斥性:只允许一个持有锁的对象的进入临界资源可用性:无论何时都要保证锁服务的可用性&#x…...

2023年A特种设备相关管理(锅炉压力容器压力管道)证模拟考试题库及A特种设备相关管理(锅炉压力容器压力管道)理论考试试题
题库来源:安全生产模拟考试一点通公众号小程序 2023年A特种设备相关管理(锅炉压力容器压力管道)证模拟考试题库及A特种设备相关管理(锅炉压力容器压力管道)理论考试试题是由安全生产模拟考试一点通提供,A特…...
系统及其存储相关
1.区分系统(软件)和固件 1.1概念辨别 系统(软件software): 角色: 系统是计算机中的核心软件,提供基本的管理、控制和资源分配功能。它通常包括操作系统,负责管理硬件资源、提供用户…...

鸿蒙原生应用开发-折叠屏、平板设备服务卡片适配
一、多设备卡片适配原则 为不同尺寸的卡片提供不同的功能 在卡片开发过程中请考虑适配不同尺寸的设备,特别是在折叠屏和平板设备上,设备屏幕尺寸的变化直接影响了卡片内容的展示。请发挥想象力设计具有自适应能力的卡片,避免在卡片内容不做…...
android查漏补缺(8)Android广播不同种类介绍
按照是否有序分类 1,普通广播(无序广播) 广播按照逻辑上同一时刻(实际可能被CPU按照抢占式任务无序发给注册模块)发送给注册模块 #发送方法: Context.sendBroadcast() 2,有序广播 广播按照…...

什么是美颜SDK?直播美颜SDK技术深度剖析
在实现实时美颜的过程中,美颜SDK扮演着关键的角色,它为开发者提供了一套强大的工具,使得实时美颜效果能够轻松应用于直播平台。 一、美颜SDK的基本概念 美颜SDK是一种软件工具包,通过集成了丰富的图像处理算法和实时计算技术&a…...

红海营销时代,内容占位的出海品牌更有机会营销占位
#01 品牌出海:内容占位就是品牌营销占位 红海营销时代,内容信息充斥着用户周边。无论线上还是线下,生活工作、休闲娱乐等不同场景内,广告信息均无孔不入。对于用户来说,能记住的品牌或者商品往往寥寥无几。 占位营销…...

解决龙芯loongarch64服务器编译安装Python后yum命令无法使用的问题“no module named ‘dnf‘”
引言 在使用Linux系统时,我们经常会使用yum来管理软件包。然而,有时候我们可能会遇到yum不可用的情况,其中一个原因就是Python的问题。本文将介绍Python对yum可用性的影响,并提供解决方案。 问题引发 正常情况下,安装linux系统后,yum命令是可用状态,升级Python版本后,…...

Leetcode2937. 使三个字符串相等
Every day a Leetcode 题目来源:2937. 使三个字符串相等 解法1:枚举 设 len1、len2、len3 分别为字符串 s1、s2、s3 的长度。 min_len 是 3 个字符串长度的最小值。 枚举 len min_len 到 len 1,设 t1、t2、t3 分别是字符串 s1、s2、s…...

<MySQL> 如何合理的设计数据库中的表?数据表设计的三种关系
目录 一、表的设计 二、一对一关系 三、一对多关系 四、多对多关系 一、表的设计 数据库设计就是根据需要创建出符合需求的表。 首先根据需求找到体系中的关键实体对象,通常每个实体对象都会有一个表,表中包含了这个实体的相关属性。 再理清楚实体对…...

基于操作系统讨论Java线程与进程、浅谈Go的线程与管程
文章目录 操作系统中的进程进程概念进程的状态 Java中的进程Java进程的概念Java进程的特性Java进程的状态Java进程与操作系统进程的通信 操作系统的进程和Java进程的区别联系操作系统进程Java 进程区别和联系 操作系统中的线程动机优点多核编程 Java中的线程定义:特…...

CICD 持续集成与持续交付——jenkins
部署 软件下载:https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/ [rootcicd2 ~]# rpm -ivh jdk-11.0.15_linux-x64_bin.rpm[rootcicd2 ~]# yum install -y fontconfig[rootcicd2 ~]# rpm -ivh jenkins-2.432-1.1.noarch.rpm启动服务 [rootcicd2 ~]# systemctl…...
【Zabbix】Zabbix Agent 2在Ubuntu/Debian系统上的安装
一、Zabbix Agent 2介绍 Zabbix Agent 2是一款监控软件,由Zabbix SIA开发。Zabbix Agent 2可以提供系统、服务、应用程序和网络设备的监控及性能指标数据收集。它是通过在被监视的主机上运行来获取数据。Zabbix Agent 2可以在Linux、Unix、Windows和MAC平台上运行&…...

浅谈无线测温产品在菲律宾某工厂配电项目的应用
摘要:配电系统是由多种配电设备和配电设施所组成的变换电压和直接向终端用户分配电能的一个电力网络系统。由于配电系统作为电力系统的一个环节直接面向终端用户,它的完善与否直接关系着广大用户的用电可靠性和用电质量,因而在电力系统中具有…...

软件工程第十一周
面向对象 面向对象编程(Object-Oriented Programming, OOP)不仅仅是一种程序设计方法,它更是一种深刻的软件工程开发思想。这种思想的核心在于通过抽象和封装来模拟现实世界中的对象和概念,以便更好地管理和解决复杂的软件工程问…...

【从入门到起飞】JavaSE—带你了解Map,HashMap,TreeMap的使用方法
🎊专栏【Java基础】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【The truth that you leave】 🥰欢迎并且感谢大家指出我的问题 文章目录 🌺双列集合的特点🎄Map🍔Ma…...

[Docker]六.Docker自动部署nodejs以及golang项目
一.自动部署nodejs 1.创建node项目相关文件 app.js代码如下: var express require(express);var appexpress();app.get(/,function(req,res){res.send(首页update); }) app.get(/news,function(req,res){res.send(首页); })//docker做端口映射的时候不要指定ip app.listen(30…...

FPC焊点剥离失效分析
一、案例背景 FPC在后续组装过程中,连接器发生脱落。在对同批次的样品进行推力测试后,发现连接器推力有偏小的现象。据此进行失效分析,明确FPC连接器脱落原因。 #1、#2样品连接器脱落连接器脱落;#3样品连接器未脱落;…...

Java爬虫框架下代理使用中的TCP连接池问题及解决方案
引言 当使用Java爬虫框架进行代理爬取时,可能会遇到TCP连接池问题,导致"java.net.BindException: Cannot assign requested address"等错误。本文将介绍如何以爬取小红书为案例,解决Java爬虫框架中代理使用中的TCP连接池问题&…...

PostgreSQL 数据定义语言 DDL
文章目录 表创建主键约束非空唯一约束检查约束外键约束默认值约束 触发器表空间构建表空间 视图索引索引的基本概念索引的分类创建索引 物化视图 表创建 PostgreSQL表的构建语句与所有数据库都一样,结构如下,其核心在于构建表时,要指定上一些…...

数据库管理-第334期 Oracle Database 23ai测试版RAC部署文档(20250607)
数据库管理334期 2024-06-07 数据库管理-第334期 Oracle Database 23ai测试版RAC部署文档(20240607)1 环境与安装介质2 操作标准系统配置2.1 关闭防火墙2.2 关闭SELinux2.3 关闭avahi-daemon2.4 时间同步配置 3 存储服务器配置3.1 配置本地yum源3.2 安装…...

人工智能--AI换脸
本文实现了一个简易的人脸交换程序,主要功能包括:1)检查所需的模型文件是否存在;2)使用预训练的Caffe模型检测图像中的人脸;3)将源图像的人脸区域通过泊松融合无缝地替换到目标图像上。程序通过OpenCV的DNN模块加载人脸检测模型&a…...

基于Java(SpringBoot、Mybatis、SpringMvc)+MySQL实现(Web)小二结账系统
结账系统 1.引言 1.1.编写目的 此说明书在概要设计的基础上,对小二结账系统的各个模块、程序分别进行了实现层面上的要求和说明。在以下的详细设计报告中将对在本阶段中对系统所做的所有详细设计进行说明。在本阶段中,确定应该如何具体的实现所要求的…...

408第一季 - 数据结构 - 线性表
只能用C/C! 顺序表 闲聊 线性表的逻辑顺序和物理顺序相同 都是1234 顺序表的优点: 随机访问,随机访问的意思是访问的时间 和位置没有关系,访问下标1和100一样的,更深层就是直接计算 a100 * 数组大小,随便…...
Build a Large Language Model (From Scratch) 序章
关于本书 《从零构建大型语言模型》旨在帮助读者全面理解并从头创建类似GPT的大型语言模型(LLMs)。 全书首先聚焦于文本数据处理的基础知识和注意力机制的编码,随后指导读者逐步实现一个完整的GPT模型。书中还涵盖了预训练机制以及针对文本…...
C++中const关键字详解:不同情况下的使用方式
在 C 中,const 关键字用于指定一个对象或变量是常量,意味着它的值在初始化之后不能被修改。下面详细介绍 const 修饰变量、指针、类对象和类中成员函数的区别以及注意事项。 修饰变量 详细介绍 当 const 修饰变量时,该变量成为常量&#x…...
caliper config.yaml 文件配置,解释了每个配置项的作用和注意事项
以下是添加了详细备注的 config.yaml 文件配置,解释了每个配置项的作用和注意事项: # Caliper 性能测试主配置文件 # 文档参考: https://hyperledger.github.io/caliper/# 测试轮次配置 - 可以定义多个测试轮次,每个轮次测试不同的合约或场景 rounds:# 第一个测试轮次 - 测试…...

【WPF】WPF 项目实战:用ObservableCollection构建一个可增删、排序的管理界面(含源码)
💡WPF 项目实战:构建一个可增删、排序的光源类型管理界面(含源码) 在实际的图像处理项目中,我们经常需要对“光源类型”进行筛选或管理。今天我们来一步步构建一个实用的 WPF 界面,实现以下功能࿱…...

制作个人Github学术主页
1.fork一个模板 从模板网站Jekyll Themes fork一个模板,并在repository name里填入yourname.github.io 2.生成自己的site 按顺序点击以下按钮,修改Branch为master /root 然后点击save ,等待一会后刷新,便会生成一个新的site。 3.…...
Q: dify前端使用哪些开发框架?
【回到目录】~~~~【回到问题集】 Q: dify前端使用哪些开发框架? A: 通过查看Readme.md,可以了解到使用以下框架 1. [Next.js] (https://nextjs.org/) React Framework 2. Node.js > v22.11.x 3. pnpm v10.x 4. Storybook UI component development 4. Je…...