通过Redis实现分布式锁

Redis实现分布式锁 1. 为什么需要分布式锁?我们都知道,以上情况,,此时就2. 单机锁 & 分布式锁的定义:3. 分布式锁应该具备哪些条件?4. 分布式锁都有哪些主流的实现方案?分布式锁的核心是实现多线程之间互斥,而满足这一点的方式有很多,常见的有三种:补充:Zookeeper实现分布式锁的思路实现分布式锁的核心思路5. 如何用 Redis 实现分布式锁的?Redis本身可以被多个客户端访问,正好就是一个共享存储系统,可以用来保存分布式锁,而且Redis的读写性能高,可以应对高并发的锁操作场景。 阅读详情

一 概述

在分布式系统环境中,一个方法在同一时间只能被一个机器的一个线程执行。所以系统中应设计出高可用的获取锁与释放锁,高性能的获取锁与释放锁,具备可重入特性(可理解为重新进入,由多于一个任务并发使用,而不必担心数据错误),具备锁失效机制,防止死锁。

二 Redis实现分布式锁

锁的特性:

  1. 互斥性:任意时刻只能有一个客户端获取锁,不能存在两个客户端获取锁
  2. 安全性:锁只能由持有锁的客户端删除,不能由其他客户端删除
  3. 防死锁:获取锁的客户端由于某种原因而宕机,未能释放锁,其他客户端也无法获取该锁,从而导致死锁,所以需要有一种机制来避免该情况的发生
  4. 容错性:当一些结点出现宕机,如一些redis结点出现宕机的时候,客户端仍然能够获取和释放锁

实现所得方案一:

SETNX key value //如果key不存在,则创建可并赋值value,且key的值不能修改

时间复杂度:O(1);

返回值:设置成功返回1;设置失败,返回0。

SENTX key已经创建好后,key就无法重新赋值,且key值是长期有效的,SETNX的操作是原子性的,要么不执行,执行了一定会走完整个执行流程。所以这时候分布式锁已经设置好后,那么该线程会一直占用锁,无法释放。

expire key seconds //会规定key 的生存时间,当key过期后就会被自动删除。

实现锁的代码

long status = redisService.setnx(key,"1"); //具有原子性

if (status == 1) {
    
    redisService.exprire(key,expire); //具有原子性

    //独占资源的逻辑代码
    function();
}

生成分布式锁方案代码所示,使用redisService.setnx(key,"1"); 然后通过status的值与1作比较,如果设置成功,则status为1,然后设置过期时间,执行独占资源的逻辑,当存在第二个线程调用redisService.setnx(key,"1")的时候,status就会被设置为0,说明存在别的线程占据了资源无法执行与资源相关的操作,下次操作只能是其他线程释放锁。

但是当某一线程执行命令redisService.setnx(key,"1");使得status为1,但是当执行if(status == 1)之后就结束了,setnx(key,"1")一直存在,使得status一直为1,所以其他线程无法对资源进行操作。这样存在原子性不足的问题。redisService.setnx(key,"1"); 和 reidsService.expire(key,expire);本身都是原子操作,但是结合起来就会存在原子性不足的问题。

三 解决原子性不足的问题

set key value [EX seconds] [PX milliseconds] [NX|XX]

  1. EX second:设置键的过期时间为second
  2. PX millisecond:设置键的过期时间为millisecond毫秒
  3. NX:只有键不存在的时候,才可以对键进行设置操作
  4. XX:只有键已经存在的时候,才对键进行设置操作
  5. SET操作完成时,返回OK,否则返回nil(理解为NULL)

解决原子性不足的代码

//原子性操作命令
String result = redisService.set(lockkey,requestID,SET_IF_NOT_EXIST,SET_WITH_EXPIRE_TIME,expireTime);

if("OK".equals(result)) {

    //执行独占资源的代码
}

注意:如果存在大量的key同时过期时,由于清楚大量的key比较消耗时间,会造成系统的卡顿,所以我们应该在设置及key过期时间的时候给每个key的过期时间加上一个随机值,使得大量的key的过期时间变得分散。

从叶片之舞到数据之眼:净空雷达如何重塑风电安全与效率的边界 净空雷达通过激光或毫米波技术实现风机叶片与塔筒间距离的毫米级实时监测,极大提升了风电场在极端天气下的安全性与运营效率。这项技术不仅预防扫塔事故,还通过数据可视化与智能分析赋能叶片健康管理和发电优化,成为风电数字化运维的核心基础设施。 阅读详情

相关推荐

Mixly/Arduino实战:WS2812点阵动态显示自定义图案与汉字

本文手把手教你使用Mixly和Arduino驱动WS2812点阵屏,实现自定义图案与汉字的动态显示。内容涵盖硬件连接、取模软件设置、高效数据处理技巧(巧用Excel)、Mixly图形化编程及Arduino代码解析,并深入探讨动态显示与滚动汉字原理,最后提供常见问题排查与性能优化心得,助你从零开始轻松玩转智能硬件。

weixin_29185199的博客 454

Redis setNx 的使用

@Autowired private RedisService redisService; @ResponseBody @RequestMapping("/draw") public R update( CpResultDO cpResult, String lotteryTime){ String key = "dealBetOrder_" + "draw"; boolean flag = redisService.setNx(key,...

卓力的博客 851

修复ASUS in WinRE教程

暑假入手了天选三,发现是win11家庭版,本来想着家庭版将就一下无所谓,结果在使用的过程中发现相较于专业版真的是不能比,于是自己就重装了系统,发现ASUS in WinRE入口不见了,折腾半天最后成功修复。

weixin_46202629的博客 1万+

Redis实现分布式锁(SETNX)

本文详细介绍了什么是分布式锁、分布式锁的特征、应用场景;一步一步的手动实现分布式锁,分析其中需要特别注意的地方,带着大家理清其中的思路;相信对大家会有所帮助

mlwsmqq的博客 1万+

Linux下科大讯飞离线语音识别SDK从下载到实战(附常见问题解决)

本文详细介绍了在Linux系统下,如何从科大讯飞开放平台获取离线语音识别SDK,完成环境准备、编译部署到实战开发的完整流程。文章重点解析了SDK目录结构、语法词典定制、示例代码修改,并针对开发中常见的“词典加载失败”、音频格式、交叉编译及性能优化等问题提供了深度解决方案,助力嵌入式与IoT开发者快速实现稳定可靠的离线命令识别功能。

honey的博客 1241

Ollama+FAISS+Embedding+Rerank+LLM 详细部署指南

下载安装Ollama 双击运行安装程序 安装完成后会自动启动服务 修改默认安装路径(避免C盘爆满) 或使用PowerShell: 验证安装 Linux系统部署: (二)准备模型 1. 拉取Embedding模型 2. 拉取LLM模型 注意:原文中提到的可能需要从自定义仓库拉取: 3. 下载Rerank模型 (三)安装依赖库 创建项目目录和虚拟环境: 二、主要功能实现 项目结构 (一)配置文件(config/config.yaml) (二)文本分块策略实现 创建 : (三)文档读取

AI技术改变世界 1582

redis的setNx方法

使用redis解决多线程问题

weixin_42855525的博客 4万+

2023华为od机试C卷【启动多任务排序】C++ 实现

一个应用启动时,会有多个初始化任务需要执行,并且任务之间有依赖关系,例如A任务依赖B任务,那么必须在B任务执行完成之后,才能开始执行A任务。现在给出多条任务依赖关系的规则,请输入任务的顺序执行序列,规则采用贪婪策略,即一个任务如果没有依赖的任务,则立刻开始执行,如果同时有多个任务要执行,则根据任务名称字母顺序排序。

MISAYAONE的博客 888

基于 Redis 做分布式锁

基于 REDIS 的 SETNX()、EXPIRE() 方法做分布式锁 setnx ()的含义就是 SET if Not Exists,其主要有两个参数 setnx(key, value)。该方法是原子的,如果 key 不存在,则设置当前 key 成功,返回 1;如果当前 key 已经存在,则设置当前 key 失败,返回 0。 expire ()设置过期时间,要注意的是 setnx 命令不能设...

刘军的博客 649

基于STM32+Qt上位机设计的智慧停车场管理系统(207)

本项目设计了一套基于STM32+Qt上位机的智慧停车场管理系统。该系统融合了先进的嵌入式技术、图像识别技术、数据库技术和移动互联网技术,通过STM32硬件端实时采集车库现场信息,包括车牌识别、车位占用状态监测等,并将数据上传至Qt上位机进行处理与展示。利用MySQL数据库存储车辆出入库记录及车位使用情况,确保数据的安全性和可追溯性;通过Android手机APP为用户提供查询、支付等功能,实现远程交互与便捷服务。

3942

【StarRocks】-- DATETIME 与 TIMESTAMP 区别详解

本文详细解析了StarRocks中DATETIME/DATETIMEV2与TIMESTAMP的区别及使用场景。DATETIME系列存储人类可读时间,不携带时区;TIMESTAMP实际指Unix时间戳,建议用BIGINT存储。关键差异包括:精度选择(DATETIMEV2支持微秒级)、时区处理(仅函数计算时影响)、存储方式等。针对不同场景提供选型建议:单时区展示用DATETIMEV2,跨时区计算用BIGINT存储Epoch。特别强调与MySQL迁移时的注意事项,并给出常见问题解决方案和最佳实践清单,包括统一入口

欢迎来到我的博客,一起探索代码里的世界! 501

Redis 中的 setnx 命令

介绍setnx的基本使用,以及再分布式场景中的问题

努力成为更好的自己~~~ 1万+

搭建自己的MQTT服务器,实现设备上云(Ubuntu+EMQX)

这篇文章教大家在ECS云服务器上部署EMQX,搭建自己私有的MQTT服务器,配置EMQX实现设备上云,设备数据转发,存储;服务器我采用的华为云的ECS服务器,系统选择Ubuntu系统。

2万+

如何用Redis实现分布式锁

为什么需要分布式锁 在聊分布式锁之前,有必要先解释一下,为什么需要分布式锁。 与分布式锁相对就的是单机锁,我们在写多线程程序时,避免同时操作一个共享变量产生数据问题,通常会使用一把锁来互斥以保证共享变量的正确性,其使用范围是在同一个进程中。如果换做是多个进程,需要同时操作一个共享资源,如何互斥呢?现在的业务应用通常是微服务架构,这也意味着一个应用会部署多个进程,多个进程如果需要修改MySQL中的同一行记录,为了避免操作乱序导致脏数据,此时就需要引入分布式锁了。 想要实现分布式锁,必须借助一个外部系统,所有

Hopefully Sky的博客 4万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

redis实现分布式锁的原理

redis实现分布式锁,从原理的实现,干货满满~~~

LYQ20010417的博客 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

redis 分布式锁实现

分布式锁

weixin_44550507的博客 2063

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Redis 实现分布式锁

本文主要介绍了Redis的分布式锁。涉及Reids的原子操作,分布式锁,Redis的事务,以及用Go语言实现通过Lua脚本来扣减库存。

tatasix的博客 1831

redis实现分布式锁_Redis分布式锁的实现

前言分布式锁一般有三种实现方式:1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper的分布式锁。本文将介绍第二种方式,基于Redis实现分布式锁。可靠性首先,为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件:互斥性。在任意时刻,只有一个客户端能持有锁。不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。具有容错性...

weixin_39647180的博客 176

Redis分布式锁实现

如果负责储存这个分布式锁的Redisson节点宕机以后,而且这个锁正好处于锁住的状态时,这个锁会出现锁死的状态。为了避免这种情况的发生,Redisson内部提供了一个监控锁的看门狗,它的作用是在Redisson实例被关闭前,不断的延长锁的有效期。默认情况下,看门狗的检查锁的超时时间是30秒钟,也可以通过修改Config.lockWatchdogTimeout来另行指定。另外Redisson还通过加锁的方法提供了leaseTime的参数来指定加锁的时间。超过这个时间后锁便自动解开了。

учёба 2419

基于Redis实现的分布式锁

利用set nx ex获取锁,并设置过期时间,保存线程标示释放锁时先判断线程标示是否与自己一致,一致则删除锁特性:利用set nx满足互斥性利用set ex保证故障时锁依然能释放,避免死锁,提高安全性利用Redis集群保证高可用和高并发特性。

Achooyo的博客 2325

redis如何实现分布式锁

1.分布式锁需要解决的问题 互斥性:任意时刻只能有一个客户端拥有锁,不能同时多个客户端获取 安全性:锁只能被持有该锁的用户删除,而不能被其他用户删除 死锁:获取锁的客户端因为某些原因而宕机,而未能释放锁,其他客户端无法获取此锁,需要有机制来避免该类问题的发生 容错:当部分节点宕机,客户端仍能获取锁或者释放锁 2.如何通过Redis实现分布式锁:(非完善方法) SETNX key value ...

随我的博客 2万+

分布式锁的作用及实现(Redis)

一、什么是分布式锁?要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁、进程锁。线程锁:主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比如synchronized是共享对象头,显示锁Lock是共享某个变量(state)。进程锁:为了控制同一操作系统中多个进程访问某...

LiQiyao的博客 8万+
上一篇: 从海量key中查询出某一固定前缀的key
下一篇: Redis实现异步队列
至学者
博客等级 码龄9年 180粉丝 773原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值