首页 > 数据库 >分布式锁-redis实现方案

分布式锁-redis实现方案

时间:2024-10-16 19:17:53浏览次数:9  
标签:方案 key redis 获取 expire 设置 客户端 分布式

分布式锁的定义

        分布式锁(Distributed Lock)是分布式系统中的一种同步机制,用于控制对共享资源的访问。在分布式环境中,由于多个服务实例或进程可能同时运行在不同的服务器上,传统的单机锁机制(如Java中的synchronized关键字或ReentrantLock)无法跨进程或跨服务器工作,因此需要一种新的机制来实现跨节点的同步控制,这就是分布式锁。

分布式锁的作用

  1. 并发正确性:确保在同一时间只有一个线程或进程能够访问某个资源,从而避免数据竞争和不一致性问题。
  2. 互斥性:分布式锁的基本功能,即一个服务实例获取锁后,其他服务实例不能获取该锁。
  3. 可重入性:一个线程或进程获取到锁之后,可以再次获取(多次获取)而不引起死锁。
  4. 锁超时:持有锁的线程或服务实例挂掉后,一定时间锁自动释放,避免死锁。

 基于Redis实现分布式锁

    使用 setnx 命令

        SETNX 是 Redis 数据库中的一个命令,全称是 "SET if Not eXists"。该命令用于在指定的 key 不存在时,为 key 设置指定的值。

        基本语法

SETNX key value

       返回值

  • 设置成功时,返回 1。
  • 设置失败(即 key 已存在)时,返回 0。

获取锁

        这种加锁的思路是,如果 key 不存在则为 key 设置 value,如果 key 已存在则 SETNX 命令不做任何操作。保证互斥非阻塞

  • 客户端A请求服务器设置key的值,如果设置成功就表示加锁成功
  • 客户端B也去请求服务器设置key的值,如果返回失败,那么就代表加锁失败
  • 客户端A执行代码完成,删除锁
  • 客户端B在等待一段时间后再去请求设置key的值,设置成功
  • 客户端B执行代码完成,删除锁 

 释放锁

        手动释放,直接删除即可

                del key

 如果获取锁成功后服务宕机,永远不会释放怎么办?

解决方案:

        超时释放:获取锁时添加一个超时时间(需要利用expire命令给锁设置一个有效期)

setnx lock thread1  #尝试获取
expire lock 10   #设置有效期

 如果获取锁成功,expire之前服务宕机怎么办?

解决方案:要保证setnx和expire命令的原子性,redis的set命令可以满足,需要添加nx和ex的选项:

  • NX:与setnx一致,第一次执行成功
  • EX:设置过期时间
set key value [EX time秒] [NX]
set lock thread1 EX 10 NX

标签:方案,key,redis,获取,expire,设置,客户端,分布式
From: https://blog.csdn.net/weixin_55049722/article/details/142988943

相关文章

  • Redis的缓存问题
    缓存雪崩定义:缓存雪崩是指在某个时间段内,缓存中的大量数据同时失效或者大量的请求集中到某一个时间点发生,导致数据库压力骤增,甚至引起服务崩溃的现象。原因:通常是由于缓存中的大量数据同时过期或者大量的请求集中到某一时间点。例如,如果缓存中的大量数据在同一时间点过期,那......
  • Excel DLL丢失?Excel DLL文件下载指南及常见问题解决方案
    当您在使用MicrosoftExcel时遇到提示DLL文件丢失或损坏的情况,这可能会影响软件的正常运行。为了帮助您解决这一问题,本文提供了ExcelDLL文件的下载指南,并针对常见问题给出了解决方案。一、ExcelDLL文件下载指南确定缺失的DLL文件:首先,您需要确定是哪个DLL文件丢失或损坏......
  • Redis 5.0 安装
    注意事项默认文件存放位置可执行文件(如redis、redis-server、redis-sentinel、redis-cli):/usr/local/bin库文件:/usr/local/lib配置文件:/usr/local/etc资源文件:/usr/local/share版本大全https://download.redis.io/releases/?_gl=1*1i0ead3*_gcl_au*MjAxNzQxMDA1Lj......
  • Redis 数据导入导出
    方式一:redis-dump前置安装redis-dumphttps://blog.csdn.net/zhanaolu4821/article/details/103684237数据导出##-uuri##-a密码##-ddatabase##导出所有库/usr/local/bin/redis-dump-u127.0.0.1:63790-a123456>/data/dba/yanhao/test/testredis.json##导......
  • 公司网站修改?网站主页修改方案模板?
    目标概述明确修改目的(如提升品牌形象、增加转化率)。设定具体可衡量的目标。现状分析当前主页存在的问题。用户反馈总结。设计方案新主页布局草图。颜色搭配与字体选择。关键元素位置调整(如LOGO、导航栏、CTA按钮)。技术实现采用的技术栈(如HTML5,CSS3,J......
  • 从Windows 11 23H2升级至24H2后,Git操作提示文件所有权错误的3种有效解决方案
    从Windows1123H2升级至24H2后,Git操作提示文件所有权错误的3种有效解决方案在升级至Windows1124H2后,使用gitadd等命令时,可能会遇到如下错误提示:Error:libgit2returned:repositorypath'D:/repo/it-tools'isnotownedbycurrentuser.Toaddanexceptionforth......
  • 敏捷转型中的敏捷实践:Leangoo领歌scrum工具私有部署解决方案
    近年来,敏捷开发逐渐成为企业项目管理中的热门话题。无论是互联网公司还是传统制造业,越来越多的企业通过敏捷方法,提升了项目的交付效率和团队的协作能力。在这个背景下,如何选择合适的敏捷管理工具,并确保其安全性和灵活性,成为了不少企业关注的焦点。 很多团队在讨论敏捷实践时,会......
  • 5大主流方案对比:MySQL千亿级数据线上平滑扩容实战
    在项目初期,我们部署了三个数据库A、B、C,此时数据库的规模可以满足我们的业务需求。为了将数据做到平均分配,我们在Service服务层使用uid%3进行取模分片,从而将数据平均分配到三个数据库中。如图所示:图片后期随着用户量的增加,用户产生的数据信息被源源不断的添加到数据库中......
  • 【北汇信息】网络及诊断自动化测试软件集成方案
    方案衔接  本方案是对北汇信息提供的CAN/CANFD/CANXL/LIN/FlexRay总线网络及诊断测试解决方案的进一步补充和优化,虽然此测试系统方案的结构和接口采用模块化的设计思路,可根据测试需求进行功能模块的裁剪和定制,使测试系统具备一定的延展性并可适配不同平台变型测试需求,但在......
  • 《纪元1800》遭遇dll丢失问题无法启动:msvcr71.dll丢失详解与定制化解决方案
    《纪元1800》是一款非常受欢迎的城市建设和经济策略游戏,但有时玩家可能会遇到msvcr71.dll丢失的问题,导致游戏无法启动。msvcr71.dll是MicrosoftVisualC++运行库的一部分,负责支持许多应用程序的运行。以下是对msvcr71.dll丢失问题的详细解释及定制化解决方案。问题原......