分布式锁及其实现与应用场景

分布式锁及其实现与应用场景

分布式锁是一种用于在分布式系统中协调多个进程或线程对共享资源进行访问的机制。它的主要目的是确保在同一时间只有一个进程或线程可以访问特定资源,从而避免数据竞争和不一致问题。分布式锁通常用于集群环境中,例如微服务架构或多实例应用中,以实现数据一致性和系统的高可用性。

分布式锁的实现方式

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

这种方式利用数据库中的表来实现锁机制。典型的实现步骤如下:

  • 创建一个锁表,其中包含锁名称、锁状态和锁持有者等字段。
  • 当一个进程需要获得锁时,它尝试向锁表中插入一条记录或更新锁状态。
  • 如果插入或更新成功,表示获取锁成功;否则,表示锁已被其他进程持有。
-- 创建锁表
CREATE TABLE distributed_lock (lock_name VARCHAR(255) PRIMARY KEY,lock_status BOOLEAN,lock_owner VARCHAR(255),lock_acquired_time TIMESTAMP
);-- 尝试获取锁
INSERT INTO distributed_lock (lock_name, lock_status, lock_owner, lock_acquired_time)
VALUES ('resource_lock', TRUE, 'process_id', CURRENT_TIMESTAMP)
ON DUPLICATE KEY UPDATE
lock_status = IF(lock_status = FALSE, TRUE, lock_status),
lock_owner = IF(lock_status = FALSE, 'process_id', lock_owner),
lock_acquired_time = IF(lock_status = FALSE, CURRENT_TIMESTAMP, lock_acquired_time);

2. 基于Redis的分布式锁

Redis是一种高性能的键值存储系统,利用其原子操作特性可以实现分布式锁。常见的实现方式有以下几种:

  • 使用SET NX命令:通过设置键值对并指定过期时间来实现锁机制。
  • RedLock算法:这是Redis官方推荐的一种分布式锁算法,通过多个Redis实例来保证高可用性和容错性。

Redisson 分布式锁的实现原理

  1. 获取锁:Redisson 使用 SET 命令来尝试获取锁。具体来说,它使用 SET key value NX PX max-lock-time 命令,其中 NX 表示只有在键不存在时才设置键值,PX 指定键的过期时间。

  2. 释放锁:为了确保只有锁的持有者可以释放锁,Redisson 使用 Lua 脚本来实现原子性的锁释放操作。Lua 脚本会检查锁的持有者是否与当前请求的标识符匹配,如果匹配则删除锁,否则不做任何操作。

Redisson 分布式锁的高级特性

  • 可重入锁:Redisson 实现了可重入锁,即同一个线程可以多次获取同一个锁而不会导致死锁。
  • 公正锁:Redisson 提供了公平锁的实现,保证锁获取的顺序按照请求的顺序进行,避免“饥饿”现象。
  • 读写锁:Redisson 实现了读写锁,允许多个读操作同时进行,但写操作是排他的。
  • 联锁(MultiLock):Redisson 支持将多个锁合并为一个虚拟的锁,只要获取其中的任何一个锁成功,就表示获取联锁成功。
  • 红锁(RedLock):Redisson 实现了 RedLock 算法,通过在多个 Redis 实例上获取锁来提高分布式锁的可靠性和容错性。
import org.redisson.Redisson;
import org.redisson.api.RReadWriteLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;public class RedissonReadWriteLockExample {public static void main(String[] args) {// 创建 Redisson 配置Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");// 创建 Redisson 客户端RedissonClient redisson = Redisson.create(config);// 获取读写锁RReadWriteLock rwlock = redisson.getReadWriteLock("myReadWriteLock");// 获取读锁rwlock.readLock().lock();try {// 执行业务逻辑System.out.println("Read lock acquired");} finally {// 释放读锁rwlock.readLock().unlock();}// 获取写锁rwlock.writeLock().lock();try {// 执行业务逻辑System.out.println("Write lock acquired");} finally {// 释放写锁rwlock.writeLock().unlock();}// 关闭 Redisson 客户端redisson.shutdown();}
}

分布式锁的实际使用场景

  1. 分布式定时任务调度:确保同一时间只有一个实例执行定时任务,避免数据不一致或资源竞争问题。
  2. 分布式事务:协调多个服务或数据库的操作,保证数据一致性。
  3. 分布式缓存一致性:确保同一时间只有一个节点能够更新缓存,从而保证缓存数据的一致性。
  4. 限流和限速:实现全局的限流和限速策略,防止系统过载。
  5. 分布式资源分配:确保同一时间只有一个进程能够分配特定资源,避免资源冲突和浪费。
  6. 微服务间的同步和协调:确保操作按照预期的顺序进行,避免并发问题。
  7. 集群中单实例任务:确保某些任务只能由一个实例来执行,避免冲突和资源浪费。

分布式锁在分布式系统中有广泛的应用场景,主要用于解决并发访问共享资源的问题。通过使用分布式锁,可以确保数据的一致性、系统的高可用性和资源的有效利用,从而提高系统的可靠性和性能。

在这里插入图片描述

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

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

相关文章

Rpc服务的提供方(Rpcprovider)的调用流程

首先,服务的提供方,会通过rpcprovider向rpc服务方注册rpc服务对象和服务方法, 那么,我们通过protobuf提供的抽象层的service和method,将服务对象和它所对应的服务方法记录在map表中, 当它启动以后&#xff…

Qt之饼图(Pie Graph)

[TOC](Qt之饼图(Pie Graph)) 饼图名为Pie Graph,用于显示一个数据系列中各项的大小与各项总和的比例。本文基于QtCharts实现饼图的显示。 1.实现过程 1.1环境配置 (1)首先想要使用QtCharts模块,需要在安装qt时选择勾选安装QtCha…

【名企专访】|格行自有格行的骄傲,格行骄傲在哪?格行随身wifi火爆出圈的真实内幕!

最近刷视频在一个随身wifi的帖子下边看到,有个网友这样回复:“随身wifi行业真的该整治了,到处是跑路的,夸大宣传的,本来在线上买就是图个方便,现在搞得不敢买。本来利民的产品,被搞得乌烟瘴气&a…

甄选范文“论云上自动化运维及其应用”,软考高级论文,系统架构设计师论文

论文真题 云上自动化运维是传统IT运维和DevOps的延伸,通过云原生架构实现运维的再进化。云上自动化运维可以有效帮助企业降低IT运维成本,提升系统的灵活度,以及系统的交付速度,增强系统的可靠性,构建更加安全、可信、开放的业务平台。 请围绕“云上自动化运维及其应用”…

windows 10 安装tcping 使用教程

1 官网下载:tcping下载 2 复制tcping 到win10系统目录C:\Windows\System32 3 tcping 网址测试,可以指定端口 4 tcping 测试端口联通 5 tcping http模式

【原创图解 算法leetcode 146】实现一个LRU缓存淘汰策略策略的数据结构

1 概念 LRU是Least Recently Used的缩写,即最近最少使用,是一种常见的缓存淘汰算法。 其核心思想为:当内存达到上限时,淘汰最久未被访问的缓存。 2 LeetCode LeetCode: 146. LRU缓存 3 实现 通过上面LRU的淘汰策略可知&#…

【多维动态规划】Leetcode 221. 最大正方形【中等】

最大正方形 在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。 示例 1: 输入:matrix [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“…

程序中的Reduce(CPU和GPU)

前提 最近在看Reduce(归约)的相关知识和代码,做个总结。这里默认大家已经明白了Reduce的基础概念。 Reduce 根据参考链接一,Recude常见的划分方法有两种: 相邻配对:元素和它们相邻的元素配对 交错配对…

【Mybatis】Mybatis初识-通过源码学习执行流程

文章目录 1.Mybatis核心组件1.1 SqlSession1.2 SqlSessionFactory1.3 Mapper1.4 MappedStatement1.5 Executor 2. Mybatis各组件之间关系3. 构建SqlSessionFactory3.1 从XML文件中构建3.2 不使用XML构建SqlSessionFactory 4. 如何从SqlSessionFactory获取SqlSession5.获取Mappe…

【AMBA】APB总线的个人学习记录(一):理论知识

精通APB (Advanced Peripheral Bus) 总线设计通常意味着你不仅理解其基础概念,而且能够在实际的硬件设计中灵活运用APB总线,解决复杂问题,并优化设计。以下是一些关键点,当你掌握这些方面时,可以说你对APB总线设计有了…

《昇思25天学习打卡营第6天|onereal》

Vision Transformer(ViT)简介 近些年,随着基于自注意(Self-Attention)结构的模型的发展,特别是Transformer模型的提出,极大地促进了自然语言处理模型的发展。由于Transformers的计算效率和可扩…

[OtterCTF 2018]Bit 4 Bit

我们已经发现这个恶意软件是一个勒索软件。查找攻击者的比特币地址。** 勒索软件总喜欢把勒索标志丢在显眼的地方,所以搜索桌面的记录 volatility.exe -f .\OtterCTF.vmem --profileWin7SP1x64 filescan | Select-String “Desktop” 0x000000007d660500 2 0 -W-r-…

数据库系统概论(第5版教材)

第一章 绪论 1、数据(Data)是描述事物的符号记录; 2、数据库系统的构成:数据库 、数据库管理系统(及其开发工具) 、应用程序和数据库管理员; 3、数据库是长期存储在计算机内、有组织、可共享的大量数据的集合&…

带上作弊器,我不得起飞

前言 过去,我们对人工智能既期待又害怕.人类的惰性希望人工智能可以帮助大家从大部分繁重的工作中解放出来,但又害怕它失控. 智能系统的好处 工作方面 自动化与效率提升:可以自动执行许多重复性和低技能的任务,如制造业中的装配、数据输入和办公室的客户…

原子变量原理剖析

一、原子操作 原子操作保证指令以原子的方式执行,执行过程不被打断。先看一个实例,如下所示,如果thread_func_a和thread_func_b同时运行,执行完成后,i的值是多少? // test.c static int i 0;void thread…

多表执行嵌套查询,减少笛卡尔积,防止内存溢出

问题:当涉及四个表的查询时,会产生大量的笛卡尔积导致内存溢出。 解决办法 :可以使用嵌套查询将多表的联合查询拆分为单个表的查询,使用resultmap中的association(适合一对一) 或 collection(一…

医院消防设施设备管理系统

医院为人员密集场所,且多为各类病患及其陪护人员,一旦发生火灾,人员疏散逃生困难,容易造成较严重的生命与财产损失。为规范医院的消防设施设备管理,通过凡尔码系统对医院消防设施设备进行信息化管理,提高医…

MapReduce学习

目录 7.3 MapReduce工作流程 7.3.1 工作流程概述 7.3.2 MapReduce各个执行阶段 7.3.3 Shuffle过程详解 1. Shuffle过程简介(过程分为Map端的操作和Reduce端的操作) 2、Map端的Shuffle过程: 3、在Reduce端的Shuffle过程 7.4 实例分析&am…

使用supportFragmentManager管理多个fragment切换

android studio创建的项目就没有一个简单点的框架,生成的代码都是繁琐而复杂,并且不实用。 国内的页面一般都是TAB页面的比较多,老外更喜欢侧边菜单。 如果我们使用一个activity来创建程序,来用占位符管理多个fragment切换&…

五、Spring IoCDI ★ ✔

5. Spring IoC&DI 1. IoC & DI ⼊⻔1.1 Spring 是什么?★ (Spring 是包含了众多⼯具⽅法的 IoC 容器)1.1.1 什么是容器?1.1.2 什么是 IoC?★ (IoC: Inversion of Control (控制反转))总…