【分布式系列】分布式锁的设计与实现

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术,jvm,并发编程 redis,kafka,Spring,微服务等
    • 常用开发工具系列:常用的开发工具,IDEA,Mac,Alfred,Git,typora 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 新空间代码工作室:提供各种软件服务,承接各种毕业设计,毕业论文等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

    • 一.分布式锁的设计原则
    • 二.分布式锁的实现方式
      • 1.基于数据库的实现
      • 2.基于缓存的实现
      • 3.基于 ZooKeeper 的实现
    • 三.分布式锁的可重入性
    • 四.实现示例
    • 五.结论

在分布式系统中,多个进程或线程可能会同时访问共享资源。为了保证数据的一致性和完整性,需要一种机制来确保在任何时刻只有一个进程或线程能够访问特定的资源。这种机制被称为分布式锁。本文将探讨分布式锁的设计原则、实现方式以及如何实现可重入性。
在这里插入图片描述

一.分布式锁的设计原则

  1. 互斥性:在任意时刻,只有一个进程可以持有锁。
  2. 安全性:即使在系统发生故障的情况下,也不会出现死锁。
  3. 性能:锁的获取和释放操作应该尽可能快,以减少对系统性能的影响。
  4. 可扩展性:随着系统规模的扩大,锁的性能不应显著下降。

二.分布式锁的实现方式

1.基于数据库的实现

利用数据库的唯一索引特性,可以创建一个表来存储锁的信息。当需要获取锁时,尝试插入一条记录,如果插入成功,则认为获取了锁;如果插入失败(违反了唯一性约束),则等待或重试。

2.基于缓存的实现

使用 Redis 等缓存系统,可以利用其原子操作来实现分布式锁。例如,使用SETNX命令设置一个键,如果该键不存在,则操作成功,认为获取了锁;如果键已存在,则操作失败,需要等待或重试。

3.基于 ZooKeeper 的实现

ZooKeeper 是一个为分布式应用提供一致性服务的软件,它的节点可以用于实现分布式锁。通过创建一个临时顺序节点,所有试图获取锁的进程都在该节点下创建自己的临时顺序节点,谁的序号最小谁就获得锁。

三.分布式锁的可重入性

可重入性是指一个进程在持有锁的情况下,可以多次请求同一把锁而不会导致死锁的特性。实现可重入的分布式锁通常需要以下步骤:

  1. 识别当前进程:每个进程在请求锁时,需要有一个唯一标识。
  2. 记录锁的持有者:在锁的数据结构中记录持有者的标识和持有次数。
  3. 检查锁的持有者:当一个进程请求锁时,首先检查当前锁的持有者是否是该进程。
  4. 增加持有计数:如果是同一进程请求锁,则增加该进程的持有计数。
  5. 释放锁时减少计数:当进程释放锁时,减少持有计数,当计数减到 0 时,才真正释放锁。

四.实现示例

以下是一个使用 Redis 实现的简单分布式锁的伪代码示例:

import redis
import threading

class DistributedLock:
    def __init__(self, redis_client, lock_key, timeout=10):
        self.redis_client = redis_client
        self.lock_key = lock_key
        self.timeout = timeout
        self.held = False
        self.locks_held = 0

    def acquire(self):
        if self.held:
            self.locks_held += 1
            return True
        else:
            unique_id = threading.current_thread().ident
            result = self.redis_client.set(self.lock_key, unique_id, ex=self.timeout, nx=True)
            if result:
                self.held = True
                self.locks_held = 1
                return True
            else:
                return False

    def release(self):
        if self.held and self.locks_held > 0:
            self.locks_held -= 1
            if self.locks_held == 0:
                self.redis_client.delete(self.lock_key)
                self.held = False

    def __enter__(self):
        return self.acquire()

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.release()

# 使用示例
with DistributedLock(redis.StrictRedis(), 'my_lock_key') as lock:
    # 临界区代码
    pass

在这里插入图片描述

五.结论

分布式锁是确保分布式系统中数据一致性的关键技术。通过选择合适的实现方式和考虑可重入性,可以设计出既安全又高效的分布式锁。然而,分布式锁的使用也应谨慎,因为不当的使用可能会导致系统性能下降或产生死锁。在设计分布式系统时,应权衡使用分布式锁的利弊,并探索其他可能的解决方案,如使用无锁编程技术或乐观锁等。

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年【电工(初级)】考试内容及电工(初级)模拟考试题

题库来源:安全生产模拟考试一点通公众号小程序 电工(初级)考试内容参考答案及电工(初级)考试试题解析是安全生产模拟考试一点通题库老师及电工(初级)操作证已考过的学员汇总,相对有…

博途TIA Portal「集成自动化软件」下载安装,TIA Portal 灵活多变的编程环境

在编程领域,博途TIA Portal以其卓越的编程工具和灵活多变的编程环境,为众多用户提供了前所未有的便利。这款软件不仅支持多种编程语言,如梯形图(Ladder Diagram)、功能块图(Function Block Diagram&#xf…

linux的CP指令

实现 CP 指令 src 源文件 des 目标文件 执行流程: 打开源文件( src ) open 打开目标文件( des ) open 写入目标文件 write 读取 src 文件到缓存数组 read 关闭目标文件和源文件 close ./a.out src.c de…

Linux开发讲课22---I2C读写 EEPROM 实验(含代码)

EEPROM 是一种掉电后数据不丢失的存储器,常用来存储一些配置信息,以便系统重新上电的时候加载之。 EEPOM 芯片最常用的通讯方式就是 I2C 协议,本小节以 EEPROM的读写实 验为大家讲解 STM32 的 I2C 使用方法。实验中 STM32 的 I2C 外设采用主模…

漫步5G-A City,一份独属于上海的浪漫

作家亨利詹姆斯曾写道,“城市漫步,让我接触到了这个世界上最好的东西”。 用漫无目的地行走,来体验和观察一座城市,上海凭借丰富多元的文化特质,成为citywalk这种浪漫生活方式的流行地。 无论你是漫步在美术馆、画廊林…

Linux shell编程学习笔记60:touch命令

0 前言 在csdn技能树Linux入门的练习题中,touch是最常见的一条命令。这次我们就来研究它的用法。 1 touch命令的功能、格式和选项说明 我们可以使用touch --help命令查看touch命令的帮助信息。 [purpleendurer bash ~ ]touch --help Usage: touch [OPTION]... …

解决java中时间参数的问题

在java的日常开发中,我们经常需要去接收前端传递过来的时间字符串,同时给前端返回数据时,也会涉及到时间字段的数据传递,那么我们要如何处理这些字段呢? 知识铺垫:java最后返回的时间是时间世界&#xff0…

吉利银河L6(官方小订送的3M) 对比 威固vk70+ks15

吉利送的号称价值2000的3M效果 撕膜重贴 威固vk70ks15 之后的效果 // 忘记测反射的热量了 可以验证金属膜是反射热而不是吸热 金属膜 手机GPS还能用吗 亲测 能用 太阳能总阻隔率 3M貌似20%出头 威固前档55% 侧后挡高一点不超过60% 夏天真实太阳发热能量 即阻隔率55%到60% …

时序数据中的孤立野点、异常值识别及处理方法

目录 参考资料 对时序数据做差分; 参考资料 [1] 离群点(孤立点、异常值)检测方法 2017.6;

重温react-06(初识函数组件和快速生成格式的插件使用方式)

开始 函数组件必然成为未来发展的趋势(个人见解),总之努力的去学习,才能赚更多的钱.加油呀! 函数组件的格式 import React from reactexport default function LearnFunction01() {return (<div>LearnFunction01</div>) }以上是函数式组件的组基本的方式 快捷生…

前端开源项目Vuejs:让前端开发如虎添翼!

文章目录 引言一、Vue.js的优势二、Vue.js实战技巧三、Vue.js社区与资源结语 引言 在前端开发的世界里&#xff0c;Vue.js凭借其简洁、轻量且功能强大的特性&#xff0c;逐渐崭露头角&#xff0c;成为众多开发者心中的首选框架。 一、Vue.js的优势 Vuejs项目地址 Vue.js之…

Linux开发讲课19--- SPI原理

一、概述 SPI&#xff08;Serial Peripheral Interface&#xff09;&#xff0c;是一种高速串行全双工的接口。最早由Motorola首先提出的全双工同步串行外围接口&#xff0c;采用主从模式(Master—Slave)架构&#xff0c;支持一个或多个Slave设备。SPI接口主要应用在EEPROM、F…

深入 SSH:解锁本地转发、远程转发和动态转发的潜力

文章目录 前言一、解锁内部服务&#xff1a;SSH 本地转发1.1 什么是 SSH 本地转发1.2 本地转发应用场景 二、打开外部访问大门&#xff1a;SSH 远程转发2.1 什么是 SSH 远程转发2.2 远程转发应用场景 三、动态转发&#xff1a;SSH 让你拥有自己的 VPN3.1 什么是 SSH 动态转发3.…

仓库管理系统17--客户管理

原创不易&#xff0c;打字不易&#xff0c;截图不易&#xff0c;多多点赞&#xff0c;送人玫瑰&#xff0c;留有余香&#xff0c;财务自由明日实现 1、添加用户控件 <UserControl x:Class"West.StoreMgr.View.CustomerView"xmlns"http://schemas.microsof…

镭速是如何做到对涉密文件进行大数据迁移的?

随着公司业务的扩展和技术创新&#xff0c;企业经常需要在不同的系统和云服务之间转移庞大的数据量&#xff0c;以适应业务需求和提高资源使用效率。但这一过程中&#xff0c;安全问题尤为突出&#xff0c;成为IT部门的首要挑战。 本文将探讨在大规模数据迁移中可能遇到的安全风…

C语言入门课程学习笔记8:变量的作用域递归函数宏定义交换变量

C语言入门课程学习笔记8 第36课 - 变量的作用域与生命期&#xff08;上&#xff09;第37课 - 变量的作用域与生命期&#xff08;下&#xff09;实验—局部变量的作用域实验-变量的生命期 第38课 - 函数专题练习第39课 - 递归函数简介实验-递归小结 第40课 - C 语言中的宏定义实…

陶瓷化聚烯烃研究逐渐增多 行业即将进入规模化生产阶段

陶瓷化聚烯烃研究逐渐增多 行业即将进入规模化生产阶段 陶瓷化聚烯烃是一种陶瓷化高分子材料&#xff0c;同时也是一种防火阻燃复合材料&#xff0c;主要由聚烯烃&#xff08;作为基材&#xff09;、成瓷填料&#xff08;如无机硅酸盐等&#xff09;、助熔剂、补强剂&#xff0…

MySQL之覆盖索引

什么是覆盖索引&#xff1f; 覆盖索引&#xff1a;查询时使用了索引&#xff0c;且需要返回的列&#xff0c;在改索引中已经全部能找到。 示例&#xff1a;有user表如下&#xff1a; CREATE TABLE user (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 技术主键,name varch…

数据中心网络100GbE发展趋势

100G光产品的技术突破不断满足超大规模数据中心的需求。5G的发展使许多行业能够实现高数据吞吐量和低延迟。从2017年至今&#xff0c;不少企业已经升级到100G数据中心网络&#xff0c;进而追求400G/800G网络。与此同时&#xff0c;其他小型数据中心已逐渐升级至100G。 是什么推…

大数据开发如何管理项目

在面试的时候总是 会问起项目&#xff0c;那在大数据开发的实际工作中&#xff0c;如何做好一个项目呢&#xff1f; 目录 1. 需求分析与项目规划1.1 需求收集与梳理1.2 可行性分析1.3 项目章程与计划 2. 数据准备与处理2.1 数据源接入2.2 数据仓库建设2.3 数据质量管理 3. 系统…