爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      深度分析Redis分布式锁在电商超卖业务场景下的使用

      首页 知识中心 云计算 文章详情页

      深度分析Redis分布式锁在电商超卖业务场景下的使用

      2023-06-12 09:39:03 阅读次数:454

      Redis,节点,锁

      专注于PHP、MySQL、Linux和前端开发,感兴趣的感谢点个关注哟!!!文章整理在GitHub,Gitee主要包含的技术有PHP、Redis、MySQL、JavaScript、HTML&CSS、Linux、Java、Golang、Linux和工具资源等相关理论知识、面试题和实战内容。

      前面写了一篇关于用Redis来解决秒杀业务场景下超卖的文章,罗列了秒杀场景下,为什么会超卖?如何解决超卖?使用Redis分布式锁有哪些问题?提到了几种实现技术方案。原文链接。感兴趣的可以阅读。 深度分析Redis分布式锁在电商超卖业务场景下的使用

      今天继续给大家分享一篇关于Redis分布式锁的文章,其中的主角就是Redis作者提到的redlock。

      在上一篇文章的结尾处,我当时提出了这样一个问题。如果是集群、主从复制和哨兵模式的部署模式情况下,Redis的分布式锁如何保证实现高可用。大家看到此处的时,可以先思考一下,如何保证?

      Redlock定义

      Redlock是Redis作者针对集群、主从复制等业务场景下,用Redis实现分布式锁高可用的一种实现算法,主要是保证Redis服务不可用场景下的锁失效问题。

      这种算法具体是怎么实现的呢?就是部署多台与master节点同等级别的其他节点,这几个Redis不参与其他的业务。每一个线程在向master节点请求锁的同时,也向这几个同等级别的节点发送加锁请求,只有当超过一半的节点数加锁成功,此时的分布式锁才算真正的成功。大致的逻辑图如下: 深度分析Redis分布式锁在电商超卖业务场景下的使用

      1. 一个thread表示一个请求,当前的thread首先向master节点发送加锁请求。

      2. 同样的,该thread需要向node1,node2,node3发送加锁请求。

      3. 只有当master节点和nodex节点返回加锁成功,才表示当前的thread加锁成功,否则加锁失败。

      Redlock由来

      假设我们的Redis部署架构是一主多从的模式,每一个thread都会往master节点写入数据,读数据都是从slave节点读数据。大致的架构模式如下: 深度分析Redis分布式锁在电商超卖业务场景下的使用

      1. 当有一个thread线程向master节点加锁成功之后,此时master节点会把加锁的数据发送给slave节点,其他的thread在根据slave节点中的锁数据,判断当前是否有锁。如果有锁则无法进行加锁操作,无锁则有且只有一个thread能够实现加锁成功。

      Redis的主从复制是异步操作的,就是说客户端在向master发送写数据之后,master不会马上把写入的数据发送给slave节点,而是先响应客户端写入数据成功之后在把新写入的数据同步给slave节点。

      1. 当然1中的描述从理论上来说是完全没有问题的,但是我们考虑一下,如果master节点在同步数据的过程中挂了。slave升级为master节点,升级为master节点的slave节点此时是没有锁数据的。其他的thread肯定会进行加锁操作。试想一下,此时整个系统只会存在一把锁吗?

      这里需要注意一下,slave切换master之后,之前的master在服务恢复之后变为slave,会情况自身的所有数据。

      通过上面的分析,我们就不难得出,Redis分布式锁在高可用架构的模式下并不一定完全可靠。因此,Redlock就诞生了。

      使用要求

      1. Redis的节点要选择奇数个节点,并且获取锁成功的节点数量必须是 成功获取锁数量 >= (节点数) / 2 + 1。奇数个是为了提高加锁成功的概念。试想一下如果是4个几点,一半加锁成功,一半加锁失败,各自占50%的几率。只有成功超过或者失败的概率超过50%,此时我就才好判断是成功与否。

      2. 记录获取锁的开始时间和结束时间。在判断锁是否成功时,要把两个时间相减,最终确认锁的存活时间。如果加锁的时间大于锁有效时长则表示加锁失败。如果活的存活时间过小,低于预估的业务时间,也要判断加锁失败。

      3. 执行业务之后,一定要向所有节点发送释放锁请求,哪怕是锁会自动失效。因为不主动释放锁,在设置锁时长过大的情况下,当前业务执行完毕之后。其他的请求仍然无法获取到锁。

      代码示例

      在Redloc定义中提到了实现的思路,下面使用伪代码演示,从代码层面该如何去实现。其实Redlock的加锁逻辑和上一篇文章提到的单机加锁逻辑都是一样的,无非就是多了记录加锁时长、判断加锁成功与否的情况处理。

      function redLock() 
      {
          // 记录加锁开始时间(这里简单一点,就用秒为单位了。实际情况用毫秒记录。)
          $lockBeginTime = time();
          
          // 锁时长
          $expireTime = 3;
          
          $redisClient = new Redis();
          // 1. 向master节点发送加锁请求
          $result1 = $redisClient->set('key', 'clientId', ['nx', 'px' => $expireTime * 1000]);
      
          // 2. 向node1发送加锁请求
          $result2 = $redisClient->set('key', 'clientId', ['nx', 'px' => $expireTime * 1000]);
      
          // 3. 向node2发送加锁请求
          $result2 = $redisClient->set('key', 'clientId', ['nx', 'px' => $expireTime * 1000]);
      
          // 4. 向node3发送加锁请求
          $result3 = $redisClient->set('key', 'clientId', ['nx', 'px' => $expireTime * 1000]);
          
          // 记录加锁结束时间(实际情况下,同样使用毫秒。)
          $lockEndTime = time();
          
          // 判断加锁是否成功
          if ((($result1 && $result2 && $result3) / 2 > 2) && ($lockEndTime-$lockBeginTime) < $expireTime) {
              // 加锁成功,执行对应的业务逻辑代码。
              // 释放锁
          } else {
              // 加锁失败,执行释放锁操作。
          }
      }
      

      一定要记住,在进行释放锁的时候,需要向每一个加锁的节点发送释放锁请求。

      加锁和解锁优化

      上面的示例代码,都是使用的同步操作去加锁和解锁。在这个过程中无疑是增加了时间上的成本消耗。某一个加锁比较慢,也很容易导致加锁失败。因此推荐在加锁和解锁的过程都采用多线程去执行加锁。

      分布式锁总结

      罗列一下个人对分布式锁中需要特别注意的事项做几个总结。这几点属于个人总结,大家阅读时,需要多多思考是否完全正确。

      1. 锁安全。既然是锁,就说明不管在任何的情况下,同一时刻,只有一个线程能够获取到资源的执行权,其他的线程是不能对该资源进行操作。这也可以理解为锁互斥。

      2. 灵活性。如果某一个或者某些节点挂了,仍然能够保证锁的稳定性、正确性,而不是某一个节点挂了就不能正常使用了。因为在实际的生产环境中,任何意向不到的情况都有可能发生。Anything is possible, but nothing is easy.。

      3. 加锁和释放。在使用完锁之后,一定要记得释放锁。哪怕是当前系统中存不存在锁,都不会影响业务的情况下也要及时的释放掉资源的占用。

      Redlock现状

      通过上面的分析,咱们基本明白了Redlock的一个实现原理。可能你也会觉得这样实现分布式锁已经没问题了,这样你就大错特错了。当Redis作者提出该概念之后,就受到很多质疑,因为这样实现分布式锁也会存在很多的问题。下面罗列一些个人现目前认知水平已经能够知道的和Redis官网的说明。后面有其他的认知,也会更新。

      1. 增加了部署成本,因为使用Redlock需要增加几台与master同等级的节点来实现加锁。这几个节点啥也不干,就只是负责加锁和释放锁逻辑。

      2. 安全争议。这个算法安全么?我们可以从不同的场景讨论一下。让我们假设客户端从大多数Redis实例取到了锁。所有的实例都包含同样的key,并且key的有效时间也一样。然而,key肯定是在不同的时间被设置上的,所以key的失效时间也不是精确的相同。我们假设第一个设置的key时间是T1(开始向第一个server发送命令前时间),最后一个设置的key时间是T2(得到最后一台server的答复后的时间),我们可以确认,第一个server的key至少会存活 MIN_VALIDITY=TTL-(T2-T1)-CLOCK_DRIFT{.highlighter-rouge}。所有其他的key的存活时间,都会比这个key时间晚,所以可以肯定,所有key的失效时间至少是MIN_VALIDITY。当大部分实例的key被设置后,其他的客户端将不能再取到锁,因为至少N/2+1个实例已经存在key。所以,如果一个锁被(客户端)获取后,客户端自己也不能再次申请到锁(违反互相排斥属性)。然而我们也想确保,当多个客户端同时抢夺一个锁时不能两个都成功。如果客户端在获取到大多数redis实例锁,使用的时间接近或者已经大于失效时间,客户端将认为锁是失效的锁,并且将释放掉已经获取到的锁,所以我们只需要在有效时间范围内获取到大部分锁这种情况。在上面已经讨论过有争议的地方,在MIN_VALIDITY{.highlighter-rouge}时间内,将没有客户端再次取得锁。所以只有一种情况,多个客户端会在相同时间取得N/2+1实例的锁,那就是取得锁的时间大于失效时间(TTL time),这样取到的锁也是无效的。

      3. 系统活性争议。系统的活性安全基于三个主要特性: 锁的自动释放(因为key失效了):最终锁可以再次被使用。客户端通常会将没有获取到的锁删除,或者锁被取到后,使用完后,客户端会主动(提前)释放锁,而不是等到锁失效另外的客户端才能取到锁。当客户端重试获取锁时,需要等待一段时间,这个时间必须大于从大多数Redis实例成功获取锁使用的时间,以最大限度地避免脑裂。然而,当网络出现问题时系统在失效时间(TTL){.highlighter-rouge}内就无法服务,这种情况下我们的程序就会为此付出代价。如果网络持续的有问题,可能就会出现死循环了。 这种情况发生在当客户端刚取到一个锁还没有来得及释放锁就被网络隔离。如果网络一直没有恢复,这个算法会导致系统不可用。

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/u_10992108/4520714,作者:7small7,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:SpringBoot开发模式自动重启热部署spring-boot-devtools

      下一篇:分布式版本控制系统——git

      相关文章

      2025-05-19 09:04:44

      spark控制台没显示其他机器

      spark控制台没显示其他机器

      2025-05-19 09:04:44
      Spark , 节点 , 集群
      2025-05-19 09:04:14

      二叉树经典OJ练习

      二叉树经典OJ练习

      2025-05-19 09:04:14
      root , 二叉树 , 子树 , 节点 , 遍历
      2025-05-16 09:15:24

      Redis Hash哈希

      Redis Hash哈希

      2025-05-16 09:15:24
      field , hash , Redis , value , 哈希
      2025-05-14 10:03:13

      【MySQL】-数据库优化(索引)

      索引(index)是帮助数据库高效获取数据的数据结构

      2025-05-14 10:03:13
      index , Tree , 二叉 , 搜索 , 数据 , 索引 , 节点
      2025-05-14 10:02:48

      互斥锁解决redis缓存击穿

      在高并发系统中,Redis 缓存是一种常见的性能优化方式。然而,缓存击穿问题也伴随着高并发访问而来。

      2025-05-14 10:02:48
      Redis , 互斥 , 数据库 , 线程 , 缓存 , 请求
      2025-05-14 10:02:48

      MongoDB常用管理命令(1)

      MongoDB常用管理命令(1)

      2025-05-14 10:02:48
      会话 , 命令 , 操作 , 节点
      2025-05-14 09:51:15

      java实现管线拓扑关系连通性分析

      管线拓扑关系的连通性分析通常涉及图论(Graph Theory)中的概念,特别是无向图(Undirected Graph)的遍历算法,如深度优先搜索(DFS, Depth-First Search)或广度优先搜索(BFS, Breadth-First Search)。

      2025-05-14 09:51:15
      BFS , DFS , 复杂度 , 搜索 , 节点 , 访问 , 遍历
      2025-05-13 09:51:17

      rac dg节点2在修改完alert_oracle_sid.log文件名,主库切换日志后备库节点2不产生新的日志文件

      rac dg节点2在修改完alert_oracle_sid.log文件名,主库切换日志后备库节点2不产生新的日志文件

      2025-05-13 09:51:17
      dg , rac , 日志 , 节点
      2025-05-13 09:51:17

      rac环境节点1修改参数后,节点2启动出现ORA-01105、ORA-01677告警

      rac环境节点1修改参数后,节点2启动出现ORA-01105、ORA-01677告警

      2025-05-13 09:51:17
      ORA , rac , 节点
      2025-05-13 09:50:28

      翻转二叉树,​​101. 对称二叉树​

      翻转二叉树给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

      2025-05-13 09:50:28
      Node , root , val , 二叉树 , 翻转 , 节点
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5247784

      查看更多

      最新文章

      分布式一致性必备:一文读懂Raft算法

      2025-04-15 09:19:55

      解决Paxos活性难题:分布式一致性的终极指南

      2025-04-15 09:19:55

      递归算法轻松学:专为新手小白打造的入门指南,新手必做树递归遍历,斐波那契数,辗转相除计算最大公约数,前后中缀表达式,DES回溯遍历,全排列问题

      2025-04-15 09:18:30

      分布式存储技术

      2025-03-28 07:42:50

      【分布式理论12】事务协调者高可用:分布式选举算法

      2025-03-11 09:36:54

      分布式架构下,Session共享有什么方案--------->分布式事务解决方案

      2025-02-25 08:57:34

      查看更多

      热门文章

      Kubernetes 为系统守护进程预留计算资源

      2023-05-15 10:03:34

      基于SpringBoot AOP面向切面编程实现Redis分布式锁

      2023-06-27 10:00:55

      数据结构与算法-二叉树的名词概念与相关数据的计算

      2023-04-06 10:10:16

      分布式-技术专区-Redis并发竞争key的解决方案详解

      2023-06-12 09:25:54

      分布式-技术专区-Redis分布式锁原理实现

      2023-05-29 10:45:37

      2、apache-kylin-3.1.3-bin-hadoop3集群部署

      2023-08-04 07:29:42

      查看更多

      热门标签

      系统 测试 用户 分布式 Java java 计算机 docker 代码 数据 服务器 数据库 源码 管理 python
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      分布式-技术专区-Redis分布式锁原理实现

      分布式事务在Java中的实现与优化

      Java服务端分布式锁:Redis与Zookeeper的实现

      【缓存】分布式缓存系统-DCache、redis、Memcached、SSDB

      分布式数据库:概述、优势与挑战

      递归算法轻松学:专为新手小白打造的入门指南,新手必做树递归遍历,斐波那契数,辗转相除计算最大公约数,前后中缀表达式,DES回溯遍历,全排列问题

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号