京东双十一高并发场景下的分布式锁性能优化
背景
在电商领域,尤其是像京东双十一这样的大促活动,系统需要处理极高的并发请求。这些请求往往涉及库存的查询和更新,如果处理不当,很容易出现库存超卖、数据不一致等问题。分布式锁作为一种有效的解决方案,能够在多个节点之间协调访问资源,确保在同一时间只有一个节点能够执行关键操作。然而,在高并发场景下,分布式锁的性能成为了一个重要的挑战。本文将深入探讨如何在京东双十一高并发场景下提升分布式锁的性能,从背景、场景、功能、底层原理到Java代码实现,进行详细的介绍和分析。
场景
在京东双十一期间,用户访问量激增,系统需要处理大量的并发请求。这些请求可能涉及库存的查询和更新,如果处理不当,很容易出现库存超卖的问题。例如,假设库存表中有100件商品,两个线程同时读到了库存为100,然后分别执行减1并写回数据库,结果数据库数据为99而不是预期的98。为了避免这种情况,可以使用分布式锁来确保在同一时间只有一个线程能够执行库存的查询和更新操作。
功能
分布式锁的主要功能是确保在分布式系统中,多个服务在请求同一个方法或者同一个业务操作的情况下,对应的业务逻辑只能被一台机器上的一个线程执行。这样可以避免并发问题,确保数据的一致性。在京东双十一这样的高并发场景下,分布式锁的性能优化尤为重要,因为它直接影响到系统的吞吐量和响应时间。
底层原理
Redis锁
Redis锁是一种常见的分布式锁实现方式。它利用Redis的原子操作来实现锁的获取和释放。Redis提供了SETNX(Set if Not Exists)命令,可以在key不存在时设置value,并返回1表示成功,否则返回0表示失败。结合EXPIRE命令,可以设置锁的过期时间,防止死锁的发生。
然而,SETNX和EXPIRE命令并不是原子的,如果在执行SETNX之后、EXPIRE之前Redis服务器宕机,那么锁就会永久存在,导致死锁。为了解决这个问题,Redis 2.8版本引入了SETEX命令,可以一次性设置key的值和过期时间,保证加锁过程的原子性。
RedLoc锁
RedLoc锁是一种基于Redis的分布式锁实现,但它通过一些优化措施提升了性能。例如,它采用了分段锁的策略,将商品库存划分为多个部分,每个部分对应一个独立的Redis锁。当请求到来时,随机选取一份库存进行加锁,实现多请求并行处理,从而提升系统吞吐量。在库存不足时,及时释放锁并切换到其他库存段。
Java代码实现与分析
下面是一个基于Redis的分布式锁的实现示例,以及一个使用RedLoc锁优化后的实现示例。
Redis锁实现
java复制代码 import redis.clients.jedis.Jedis; public class RedisLock { private Jedis jedis; private String lockKey; public RedisLock(Jedis jedis, String lockKey) { this.jedis = jedis; this.lockKey = lockKey; } public boolean acquireLock(long timeout) { long expireTime = System.currentTimeMillis() + timeout; while (System.currentTimeMillis() < expireTime) { if (jedis.setnx(lockKey, "locked")) { jedis.expire(lockKey, (int) (timeout / 1000)); return true; } if (jedis.ttl(lockKey) == -1) { jedis.expire(lockKey, (int) (timeout / 1000)); } try { Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } return false; } public void releaseLock() { jedis.del(lockKey); } }
在这个实现中,我们使用Jedis作为Redis的客户端。acquireLock
方法尝试获取锁,如果获取成功,则设置锁的过期时间。如果获取失败,则检查锁的过期时间,如果已过期,则重新设置过期时间,并继续等待获取锁。releaseLock
方法用于释放锁。
RedLoc锁实现
java复制代码 import redis.clients.jedis.Jedis; import java.util.concurrent.ThreadLocalRandom; public class RedLocLock { private Jedis jedis; private String lockKeyPrefix; private int segmentCount; public RedLocLock(Jedis jedis, String lockKeyPrefix, int segmentCount) { this.jedis = jedis; this.lockKeyPrefix = lockKeyPrefix; this.segmentCount = segmentCount; } public boolean acquireLock(String requestId) { int segmentIndex = ThreadLocalRandom.current().nextInt(segmentCount); String lockKey = lockKeyPrefix + "_" + segmentIndex; if (jedis.setnx(lockKey, requestId)) { jedis.expire(lockKey, 10); return true; } return false; } public void releaseLock(String requestId) { for (int i = 0; i < segmentCount; i++) { String lockKey = lockKeyPrefix + "_" + i; if (requestId.equals(jedis.get(lockKey))) { jedis.del(lockKey); break; } } } }
在这个实现中,我们使用了分段锁的策略。acquireLock
方法随机选取一个库存段进行加锁,如果获取成功,则设置锁的过期时间。releaseLock
方法遍历所有库存段,找到对应的锁并释放。
分布式锁的性能主要体现在以下几个方面:
1. 获取锁的速度
- 延迟:获取锁的时间延迟是衡量分布式锁性能的重要指标。在高并发场景下,如果获取锁的速度慢,会导致大量请求等待锁,从而影响系统的响应时间和吞吐量。
- 并发处理能力:分布式锁需要能够在高并发情况下快速处理多个请求,确保系统的并发处理能力。
2. 锁的释放速度
- 延迟:释放锁的时间延迟同样重要。如果释放锁的速度慢,会导致持有锁的线程或进程无法及时释放锁,从而影响其他请求的获取锁速度。
- 原子性:释放锁的操作需要是原子的,确保在释放锁的过程中不会出现并发问题。
3. 锁的粒度
- 粒度:锁的粒度越小,系统的并发处理能力越强。例如,如果锁粒度是商品库存,那么同一商品的不同规格或颜色可能需要不同的锁,这样可以提高系统的并发处理能力。
4. 锁的持有时间
- 时间:锁的持有时间越短,系统的并发处理能力越强。如果锁的持有时间过长,会导致大量请求等待锁,从而影响系统的响应时间和吞吐量。
- 自动续期:为了避免死锁和长时间持有锁的问题,一些分布式锁实现提供了自动续期功能。这可以在一定程度上提高系统的并发处理能力,但也会增加系统的复杂性。
5. 可扩展性
- 扩展能力:分布式锁的实现需要具备良好的可扩展性,能够随着系统规模的扩展而扩展。例如,在分布式系统中增加新的节点时,分布式锁应该能够自动适应新的节点并保持良好的性能。
6. 可靠性
- 稳定性:分布式锁需要具备高可靠性,确保在分布式系统中不会出现死锁、活锁等问题。这要求分布式锁的实现具备完善的错误处理机制和容错能力。
- 一致性:在分布式系统中,多个节点可能同时访问共享资源。分布式锁需要确保在任意时刻只有一个节点能够获取锁并执行临界操作,以保证数据的一致性。
7. 资源消耗
- 内存和CPU占用:分布式锁的实现需要占用一定的内存和CPU资源。在高并发场景下,如果分布式锁的资源消耗过高,会影响系统的整体性能。
- 网络开销:在分布式系统中,多个节点之间可能通过网络进行通信。分布式锁的实现需要尽量减少网络开销,以提高系统的响应速度和吞吐量。
8. 兼容性
- 跨平台支持:分布式锁需要支持多种编程语言和框架,以便在不同的分布式系统中进行部署和应用。
- 与其他组件的集成:分布式锁需要能够与其他分布式组件(如消息队列、缓存等)进行集成,以实现更加复杂的分布式系统架构。
综上所述,分布式锁的性能主要体现在获取锁的速度、锁的释放速度、锁的粒度、锁的持有时间、可扩展性、可靠性、资源消耗以及兼容性等方面。在实际应用中,需要根据具体场景选择合适的分布式锁实现方式,并进行必要的性能优化以满足系统的需求。
总结
在京东双十一这样的高并发场景下,分布式锁的性能优化尤为重要。通过选择合适的分布式锁实现方式、减小锁的粒度、限制锁的持有时间等措施,可以显著提升系统的吞吐量和响应时间。Redis锁和RedLoc锁是两种常见的分布式锁实现方式,各有优缺点。Redis锁实现简单,但在高并发场景下可能存在性能瓶颈;RedLoc锁通过分段锁的策略提升了性能,但实现相对复杂。在实际应用中,需要根据具体场景选择合适的分布式锁实现方式,并进行必要的性能优化。
相关文章:
京东双十一高并发场景下的分布式锁性能优化
背景 在电商领域,尤其是像京东双十一这样的大促活动,系统需要处理极高的并发请求。这些请求往往涉及库存的查询和更新,如果处理不当,很容易出现库存超卖、数据不一致等问题。分布式锁作为一种有效的解决方案,能够在多…...
华为ICT题库-AI 人工智能部分
1178、以下哪个选项是华为的云端AI芯片?(云服务考点) (A)Inferentia (B)MLU100 (C)Cloud TPU (D)Ascend 910 答案:D 解析:华为的云端AI芯片被称为Ascend芯片系列,其中Ascend 910是其旗舰产品。Ascend 910…...
React Native 修改安卓应用图片和名称
在React Native(RN)项目中,修改安卓应用图标和名称通常涉及对Android原生代码的一些修改。以下是详细步骤: 修改应用图标 准备图标资源: 创建或获取你想要的图标,并确保它们符合Android的图标规范…...
普推知产:商标初审已下,商标申请通过如何高些!
近期下来一批商标注册的初步审公告通知书,一些客户对商标下证要求比较高的,普推知产商标老杨发现,要像下证高核心还是在于名称,名称起好备用的多,让商标专业人士经检索后层层过滤后提报,通过会好很多。 普推…...
HICP--2
在area 0的路由器只生成 area 0 的数据库,只在area 1 的一样。但是既在又在的生成两个 area的 LSDB 一、区域间三类LSA 在OSPF(Open Shortest Path First)协议中,区域间三类LSA(Link-State Advertisement)…...
sheng的学习笔记-AI基础-正确率/召回率/F1指标/ROC曲线
AI目录:sheng的学习笔记-AI目录-CSDN博客 分类准确度问题 假设有一个癌症预测系统,输入体检信息,可以判断是否有癌症。如果癌症产生的概率只有0.1%,那么系统预测所有人都是健康,即可达到99.9%的准确率。 但显然这样的…...
Linux -- 共享内存(2)
目录 命令 ipcs -m : 命令 ipcrm -m shmid: 共享内存的通信: 为什么共享内存更高效? 代码: ShmClient.cc: ShmServer.cc: 结果: 如何让共享内存实现同步? 代码&a…...
云函数实现发送邮件,以qq邮箱为例
云函数实现发送邮件,前端传参调用发送邮件即可。以qq邮箱为例。 1、开启qq邮箱的smtp服务并且生成授权码,操作界面如下图: 2、在腾讯云新建一个云函数代码如下: const nodemailer require("nodemailer");// 云函数入口函数 export…...
Kafka如何控制消费的位置?
大家好,我是锋哥。今天分享关于【Kafka如何控制消费的位置?】面试题?希望对大家有帮助; Kafka如何控制消费的位置? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Kafka 中,控制消费位置主要通过以下几个机制来实…...
python爬虫——Selenium的基本使用
目录 一、Selenium的介绍 二、环境准备 1.安装Selenium 2.安装WebDriver 三、元素定位 1.常用定位元素的方法 2. 通过指定方式定位元素 四、窗口操作 1.最大化浏览器窗口 2.设置浏览器窗口大小 3.切换窗口或标签页 切换回主窗口 4. 关闭窗口 关闭当前窗口 关闭所…...
【Linux】【xmake】安装 + C/C++常用项目配置
文章目录 0. 环境准备1. 子命令create - 快速创建项目build - 构建程序config - 配置编译需要的参数show - 查看当前工程基本信息update - 程序自更新 2. C/C 项目常用配置2.1 项目目标类型2.2 添加宏定义2.3 头文件路径和链接库配置2.4 设置语言标准2.5 设置编译优化2.6 添加源…...
Android 添加菜单开关控制Camera相机和第三方相机
本文主要通过SystemProperties系统属性和Settings.System存储数据库的状态进行判断,从而实现控制相机 /vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values-zh-rCN/strings.xml <!--camera--> <string name="manager_camera_switch"&…...
【Java知识】使用jacoco实现代码覆盖率测试
文章目录 1. 添加JaCoCo插件到项目2. 配置Maven Surefire Plugin3. 执行测试并生成报告4. 查看覆盖率报告注意事项 要使用JaCoCo实现代码覆盖率测试,你需要遵循以下步骤: 1. 添加JaCoCo插件到项目 在Maven项目的pom.xml文件中添加JaCoCo插件。这允许你执…...
道路车辆功能安全 ISO 26262标准(9-2)—面向汽车安全完整性等级 (ASIL) 和安全的分析
写在前面 本系列文章主要讲解道路车辆功能安全ISO26262标准的相关知识,希望能帮助更多的同学认识和了解功能安全标准。 若有相关问题,欢迎评论沟通,共同进步。(*^▽^*) 1. 道路车辆功能安全ISO 26262标准 9. ISO 26262-9 面向汽车安全完整…...
hutool常用方法
1、树结构工具-TreeUtil 构建Tree示例 package com.sl.transport.common.util;import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.lang.tree.TreeNode; import cn.hutool.core…...
CloudSat数据产品数据下载与处理 (matlab)
CloudSat数据下载 这个数据我之前和CALIPSO弄混了,后来发现它们虽然是同一个火箭上去,但是数据产品却在不同的平台下,CloudSat的数据更加关注云的特性,包括云覆盖、云水当量、云分类数据。 数据网址在:CloudSat网址 …...
LDR6500 一拖三快充线的定义与特点
定义:LDR6500 一拖三快充线是一种具有 Type-C 接口的充电线,它的最大特点是可以同时连接三个设备进行快速充电。 特点: 高效充电:采用先进的快充技术,能够快速为设备充电,大大缩短充电时间。同时…...
Elasticsearch安装使用
ES 概述 Elasticsearch,简称为 ES,是一款非常强大的开源的高扩展的分布式全文检索引擎,可以帮助我们从海量数据中快速找到需要的内容,它可以近乎实时的存储、检索数据.还可以可以实现日志统计、分析、系统监控等功能. 官网:https://www.elast…...
计算机网络的主要知识点小结
计算机网络是指将多台计算机通过通信线路连接起来,实现资源共享和信息传递的系统。 一、计算机网络概述 1. 定义和功能 - 定义:计算机网络是将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操…...
fastjson/jackson对getter,setter和constructor的区分
在复现完fastjson1.2.24-1.2.80和jackson的所有相关漏洞后,总结的一些规则 以下均指对json的反序列化过程 setter fastjson调用setter:遍历所有方法,找出所有满足setter要求的方法,再根据传入的json去反射调用 jackson调用set…...
认识CSS语法
CSS(网页美容) 重点:选择器、盒子模型、浮动、定位、动画,伸缩布局 Css的作用: 美化网页:CSS控制标签的样式 网页布局:CSS控制标签的位置 概念:层叠样式表(级联样式表…...
Linux运维篇-ansible的使用
目录 ansible简介ansible架构1、连接插件2、核心模块3、自定义模块4、插件5、剧本6、主机清单 ansible的执行过程安装Ansibleansible的使用ansible.cfg文件修改添加主机清单方式一方式二方式三 测试主机清单连接 ansible简介 简单来说,ansible就是一个自动化运维工…...
【MySQL】日志
1. 日志基本了解 常见的MySQL Server日志类型,以及记录的日志信息(场景通俗理解) 错误日志 记录的主要信息由服务器关闭、启动、崩溃事件;MySQL运行过程中出现的错误、警告和严重事件以及与权限、配置相关的问题使用场景 诊断MyS…...
2024年CentOS镜像下载地址,包括CentOS官网、国内镜像下载,超详细也
这里给大家提供了4种镜像下载地址,包括CentOS官方镜像下载、阿里云开源镜像站下载、网易开源镜像下载搜狐开源镜像下载。 1.CentOS官网镜像下载 因为服务器在国外所以打开CentOS官方网站的时候可能会比较慢。大家可以选择后面几种国内镜像下载方式。 1.1进入CentO…...
STL学习-顺序容器-array数组
array模板类是C11引入。它是有着固定大小用于保存一系列同类型元素的顺序容容器,因此不能对它进行增加或者删除,只能使用或者替换它的元素值。 1.定义及初始化 array定义对象时,需要传入类型和大小,且大小不能修改。array是唯--个如果不初始化,它的初始化是不明确…...
Spring Boot框架下的酒店住宿登记系统
2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...
electron展示下载进度条
我们使用electron下载文件时,会发现不像浏览器一样会有地方展示下载进度,这导致下载一些大文件时不知道下载进度到哪里了 下面我们通过electron提供的will-download监听和element-plus中的ElNotification和ElProgress组件实现这一功能 实现逻辑 触发…...
Spark 基础操作
Spark 操作 创建操作(Creation Operation) 用于RDD创建工作。RDD创建只有两种方法,一种是来自于内存集合和外部存储系统,另一种是通过转换操作生成的RDD 转换操作(Transformation Operation) 将RDD通过一定的操作变成新的RDD,比如HadoopR…...
VoLTE 微案例:VoLTE 注册失败,I-CSCF 返回 403,HSS(UAR) 返回 5001
目录 1. 问题描述 2. 故障注册流程与正常流程对照 3. 结论 博主wx:yuanlai45_csdn 博主qq:2777137742 想要 深入学习 5GC IMS 等通信知识(加入 51学通信),或者想要 cpp 方向修改简历,模拟面试,学习指导都可以添加博主低价指导哈。 1. 问题描述...
智能财务 | 数据与融合,激发企业财务数智化转型思考
数据与融合,激发企业财务数智化转型思考 用友持续深耕企业财务领域,见证中国企业走过了财务电算化、信息化时代,当下共同经历数智化时代。2023 年度,通过走访标杆企业,与高校教授、权威机构学者共同探讨等形式…...
江西赣州网站建设/搜索网站哪个好
参考:http://www.mamicode.com/info-detail-1705113.html 先声明,热更新词库,需要用到,web项目和Tomcat。不会的,请移步 Eclipse下Maven新建项目、自动打依赖jar包(包含普通项目和Web项目) Tomc…...
承接网站建设广告语/百度推广工作怎么样
Rxjava 系列目录 最通俗易懂的教你使用RxJava3(一)最通俗易懂的教你使用RxJava3(二)最通俗易懂的教你使用RxJava3(三) Rxjava3前言常见术语总结博客创建时间:2020.04.17 博客更新时间:2021.04.15 以Android studio build4.1.3,gradle6.5&am…...
做信息网站要注册什么类型公司/百度小说搜索风云榜总榜
前言 这份Android面试真题涵盖了图片,网络和安全机制,网络,数据库,插件化、模块化、组件化、热修复、增量更新、Gradle,架构设计和设计模式,Android Framework 、Android优秀三方库源码等。适合中高级工程…...
大学生网站建设规划书/百度免费推广
目录专栏导读一、 顺丰高级开发工程师在线执行了 Redis 危险命令导致某公司损失 400 万二、测试一下1000万数据的性能1、编写脚本文件2、写入Redis1000万数据3、通过keys * 查看1000万数据4、通过配置文件禁止keys *的使用三、使用scan替代keys *四、拒绝bigkey1、阿里云Redis开…...
江门市网站建设/一句话让客户主动找你
Enabling the capability for Photo Video Camera 启用相机能力 为了使用摄像头,我们必须启用WebCam能力。 在Unity中打开Player settings展开Windows Store标签页在"Publishing Settings > Capabilities"部分勾选WebCam能力同一时刻只能执行一次相机操…...
韶关做网站需要多少钱/华夏思源培训机构官网
最近对接几家 不同的nvr厂商,有华为 金山立 大华 海康等等。大多数都是直接提供的sdk 直接把so库集成在程序里面即可 唯独华为提供的是HTTP接口 也就是所谓的RESTful方式 但是不是普通的http方式 而是 https方式 之前所有的关于Web服务的交互都是基于http的…...