分布式锁的应用场景及实现

文章目录

  • 分布式锁的应用场景及实现
    • 1. 应用场景
    • 2. 分布式锁原理
    • 3. 分布式锁的实现
      • 3.1 基于数据库

分布式锁的应用场景及实现

1. 应用场景

电商网站在进行秒杀、特价等大促活动时,面临访问量激增和高并发的挑战。由于活动商品通常是有限库存的,为了避免库存超卖和并发问题,分布式锁是一种有效的解决方案。

2. 分布式锁原理

分布式锁是一种多节点共享的同步机制,通过在多个节点之间协调访问资源,确保在同一时间只有一个节点能够获取锁并执行关键操作。

分布式锁的目的就是保证在分布式部署的应用集群中,多个服务在请求同一个方法或者同一个业务操作的情况下,对应业务逻辑只能被一台机器上的一个线程执行,避免出现并发问题。

在电商网站中,商品的库存即为共享资源,可以使用分布式锁来控制并发访问。

在这里插入图片描述

3. 分布式锁的实现

3.1 基于数据库

基于关系型数据库实现分布式锁是根据数据库的唯一性约束特性来实现资源的锁定。数据库的唯一性约束是指数据库表的某个字段值或者多个列组合的值不能重复。据此,我们可以创建一个锁表,包含资源名等字段,并为要锁定的资源名添加唯一索引。

当需要给某个资源加锁时,通过向数据库插入对应的资源来获取锁:

  • 如果插入成功,表示成功获取锁;
  • 如果插入失败,表示锁已经被占用。
  • 在成功获取锁并处理完流程后要释放锁,删除对应的表记录即可。

创建一张分布式资源锁表:

CREATE TABLE `resourceLock` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`resource_name` varchar(64) NOT NULL DEFAULT '' COMMENT '锁定的资源',
PRIMARY KEY (`id`),
UNIQUE KEY `uidx` (`resource_name `) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='对资源加锁';

如上,resource_name字段做了唯一性约束,要对某个资源加锁时,执行

insert into resourceLock(resource_name) values ("resource_name");

根据insert语句的执行结果判断是否加锁成功。

基于数据库实现分布式锁有一些问题需要注意:

  1. 超时无法失效。需要通过定时任务或时间戳对比来删除超时数据。
  2. 数据库实现方式无法实现阻塞,需要重试insert操作来阻塞其他线程,但会带来服务器和数据库资源的浪费。

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

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

相关文章

MySQL 基础知识(十)之 MySQL 架构

目录 1 MySQL 架构说明 2 连接层 3 核心业务层 3.1 查询缓存 3.2 解析器 3.3 优化器 3.4 执行器 4 存储引擎层 5 参考文档 1 MySQL 架构说明 下图是 MySQL 5.7 及其之前版本的逻辑架构示意图 MySQL 架构大致可分为以下三层: 连接层:负责跟客户…

[oeasy]python0007_ print函数_字符串_display_电传打字机_程序员的浪漫

你好世界 🥊 回忆上次内容 上次 想输出 Hello world!据说是程序猿的浪漫 键盘按键作用↑上一条指令↓下一条指令←光标 向左移动 一格→光标 向右移动 一格ctrl a光标 移动到开头ctrl e光标 移动到结尾 了解到 字符串 就是 给一串字符 两边加引号…

CAPL入门到精通之CAPL Functions(六) 时间管理函数

文章目录 Genreal Functions & Event ProceduresGeneral FunctionsTime ManagementaddTimeToMeasurementStartTime函数描述函数语法ParametersReturn ValuesExamplecancelTimer函数描述函数语法Parameters

19. 【Linux教程】nano 编辑器

前面小节介绍了如何使用 vim 编辑器,相比于 vim 编辑器,nano 编辑器就比较简单了。nano 是 UNIX 系统中的一个文本编辑器,大部分 Linux 发行版本默认都安装了 nano 文本编辑器。 和 vim 编辑器相比,nano 编辑器就没有那么强大&am…

学习文档:QT QTreeWidget及其代理

学习文档:QT QTreeWidget及其代理 1. QT QTreeWidget简介 QT QTreeWidget是QT框架中的一个重要组件,用于显示树形数据结构。它提供了一种方便的方式来展示并操作带有层次关系的数据。QTreeWidget可以显示包含多个列的树形视图,每个项目可以…

2024.2.19 阿里云Flink

一 、Flink基本介绍 Spark底层是微批处理 , Flink底层则是实时流计算 流式计算特点: 数据是源源不断产生,两大问题,乱序和延迟 Stateful:有状态 Flink的三个部分 Source:Transactions , logs ,iot ,clicks Transformation: 事件驱动 , ETL , 批处理 Sink : 输出 HDFS ,Kaf…

基于Spring Boot的多级缓存系统设计

在构建大规模应用时,缓存系统是提高性能的关键因素之一。为了更有效地利用缓存,我们可以设计一个基于Spring Boot的多级缓存系统,结合本地内存缓存(如Caffeine)和分布式缓存(如Redis)。以下是一…

Keil软件生成bin文件

首先需要在keil的魔法棒里将运行脚本加上 加上脚本后,还需要将编译后的文件存放于什么位置 C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe --bin -o "$LL.bin" "#L" 到这里就可以了

工业智能:基于LSTM的电解槽出铝量预测与可视化系统设计与实现

工业智能:基于LSTM的电解槽出铝量预测与可视化系统设计与实现 工业智能:基于LSTM的电解槽出铝量预测与可视化系统设计与实现项目背景与意义技术与功能介绍系统设计与实现结语 工业智能:基于LSTM的电解槽出铝量预测与可视化系统设计与实现 在…

Mac清理系统垃圾软件CleanMyMac X2025免费版本下载

嘿,Mac用户们,你是否经常感觉你的Mac就像是在背着一个沉重的包袱在跑步?是的,我在说那些堆积如山的系统垃圾。清理这些垃圾不仅可以让你的Mac跑得更快,还能让它“呼吸”更畅快。今天,让我们一起来探索如何M…

一加手机怎么录屏?这个方法请你收好!

“我最近刚换了一加手机,本以为录屏功能会像之前用的手机一样方便找到,但翻遍了设置菜单也没找到。我知道一加手机是支持录屏功能的,所以想请教一下,一加手机的录屏功能在哪里,应该怎么使用?” 随着智能手…

Uniapp-开发小程序

文章目录 前言一、npm run xxx —— cross-env: Permission denied解决方法(亲测有效)其他解决方法: 二、macOS 微信开发者工具选择uniapp 用 vscode 开发 总结 前言 macOS下 uniapp 开发小程序。 一、npm run xxx —— cross-env: Permissi…

神经网络——循环神经网络(RNN)

神经网络——循环神经网络(RNN) 文章目录 神经网络——循环神经网络(RNN)一、循环神经网络(RNN)二、循环神经网络结构1、一对一(One to One)2、一对多(One to Many&#…

爬虫学习笔记-scrapy爬取电影天堂(双层网址嵌套)

1.终端运行scrapy startproject movie,创建项目 2.接口查找 3.终端cd到spiders,cd scrapy_carhome/scrapy_movie/spiders,运行 scrapy genspider mv https://dy2018.com/ 4.打开mv,编写代码,爬取电影名和网址 5.用爬取的网址请求,使用meta属性传递name ,callback调用自定义的…

毛主席诗词抄写

毛泽东,字润之,笔名子任。诗人,伟大的马克思主义者,无产阶级革命家,战略家和理论家,中国共产党、中国人民解放军和中华人民共和国的主要缔造者和领导人。 沁园春.雪 北国风光 千里冰封 万里雪飘 望长城…

the file size exceeds the configured limit Android studio

方法一、打开Android studio安装目录下的bin/idea.properties,调高“idea.max.intellisense.filesize” 方法二、在Android studio中点击“Help”->"Edit custom properties", 添加 idea.max.intellisense.filesize8000 此中方法的配置优先级高于方…

C#快速配置NLog日志使用

首先我们需要在Nuget中安装Nlog和Nlog-Schema。 添加配置文件&#xff1a;NLog.config <?xml version"1.0" encoding"utf-8" ?> <nlog xmlns"http://www.nlog-project.org/schemas/NLog.xsd"xmlns:xsi"http://www.w3.org/2001…

整车 EOL下线 测试系统介绍

EOL测试系统背景 随着国家对环保事业的愈加重视&#xff0c;电动汽车以其绿色清洁的驱动方式&#xff0c;逐渐成为政策扶持 的重点对象。一方面&#xff0c;国家对电动汽车越来越重视&#xff0c;在另外一个方面&#xff0c;人们也越来越乐于绿色 出行&#xff0c;增大了电动汽…

NestJS入门1:创建项目

1.初始化 管理员权限运行CMD进入某个文件夹&#xff0c;输入命令&#xff0c;进行初始化&#xff0c;该命令不在文件夹下产生文件 npm i -g nestjs/cli 2. 创建项目 不需要手工创建文件夹&#xff0c;在原路径下执行以下命令&#xff08;其中nest-start为项目名&#xff0c…

前端新手Vue3+Vite+Ts+Pinia+Sass项目指北系列文章 —— 第十二章 常用工具函数 (Utils配置)

前言 在项目开发中&#xff0c;我们经常会使用一些工具函数&#xff0c;也经常会用到例如loadsh等工具库&#xff0c;但是这些工具库的体积往往比较大&#xff0c;如果项目本身已经引入了这些工具库&#xff0c;那么我们就没有必要再引入一次&#xff0c;所以我们需要自己封装…