news 2026/3/30 22:05:25

第十六课:分布式锁与限流设计 —— 并发系统的门禁机制(从0讲透)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第十六课:分布式锁与限流设计 —— 并发系统的门禁机制(从0讲透)

当系统只有 1 个人访问时,一切都很简单。
当 1000 个人同时访问时,系统才真正开始“考试”。

这一课,解决的就是:

  • 并发下资源冲突
  • 并发下系统被打爆
  • 多实例环境的一致性问题

核心两件事:

  • 分布式锁:保证“同一资源同一时刻只能一个人操作”
  • 限流:保证“同一时刻来的人不要太多”

可以把它们理解为:

锁 = 唯一通行证
限流 = 门口安检

一、为什么需要这节课?

在单体应用中,你可能用synchronized就够了。
但在多台服务器场景下:

用户A → 服务器1 用户B → 服务器2

两个服务器都认为自己是唯一的执行者 →数据错乱

典型问题:

  • 秒杀超卖
  • 定时任务重复执行
  • 用户重复下单
  • 报表重复生成

二、分布式锁:并发世界的“唯一钥匙”

1. 什么是分布式锁?

一句话:

在多台机器之间,保证同一时刻只有一个线程能进入临界区。

2. Redis 分布式锁核心语句

SET lock_key uuid NX PX 30000

含义拆解

参数含义
SET设置键值
NX不存在才设置
PX 3000030秒自动过期
uuid锁持有者唯一标识

3. 为什么必须 PX?

防止死锁:

  • 程序崩溃
  • 锁没释放
  • 所有人卡死

PX 相当于:

锁自动保险

4. 为什么要 UUID?

防止误删锁:

A拿锁 锁过期 B拿锁 A删除锁 → 把B的锁删了 ❌

UUID 确保:

只能删除自己的锁

5. 最关键示例:A / B 争抢同一把锁(必须理解)

很多人到这里会有疑问:

锁不是会过期吗?
那过期之后会发生什么?

下面这个时间线,是理解分布式锁的核心

场景设定
  • 锁 TTL = 30 秒
  • A 的业务执行时间 = 40 秒
  • B 在第 31 秒来抢锁
  • 锁 key =lock:sku:1001
  • A 的 uuid =uuidA
  • B 的 uuid =uuidB
时间线全过程
第 0 秒:A 加锁
SET lock:sku:1001 uuidA NX PX 30000

Redis 中:

lock:sku:1001 = uuidA

A 开始执行业务。

第 30 秒:锁过期(Redis 自动删除)
lock:sku:1001 不存在

⚠️ 注意:

A 还在执行,但锁已经没了

第 31 秒:B 加锁
SET lock:sku:1001 uuidB NX PX 30000

Redis 中:

lock:sku:1001 = uuidB

此时出现一个重要事实:

A 和 B 同时在执行业务

第 40 秒:A 执行完成,尝试解锁

❌ 如果 A 直接执行:

DEL lock:sku:1001

那么:

  • 当前锁属于uuidB
  • A 会把B 的锁删掉
  • B 在“无锁状态下”继续执行 → 严重并发问题
✅ 正确解锁方式(UUID 校验)
如果当前 value == uuidA 才删除 否则 不删除

此时 Redis 中是uuidB
uuidA不相等 →不会删除

第 51 秒:B 执行完成,正常解锁

流程安全结束。

时间线总结表
时间Redis 锁状态AB
0suuidA执行中-
30s不存在执行中-
31suuidB执行中执行中
40suuidB结束执行中
51s不存在-结束

这个例子说明了什么?

  1. 锁过期 ≠ 业务结束

  2. 过期后再加锁,是一把“新锁”

  3. 解锁必须校验 UUID

  4. 否则一定会误删别人的锁

6. 解锁必须用 Lua 脚本

因为 Redis 单线程,但命令不是事务。

必须做到:

  • 比较 value
  • 再删除

原子执行。

7. 分布式锁常见坑

原因解决
锁过期业务未完成TTL太短续租/延长
锁误删没UUIDUUID+Lua
拿不到锁高并发重试/失败返回

三、限流:系统的流量闸门

1. 什么是限流?

限制单位时间内请求数量。

防止:

  • 接口被打爆
  • 数据库宕机
  • 第三方服务雪崩

2. 常见限流算法

1)固定窗口

每分钟 100 次,分钟结束清零。
问题:边界抖动。

2)滑动窗口

更平滑,但复杂。

3)令牌桶(推荐)

思想:

  • 按速率生成令牌
  • 请求拿到令牌才放行

优点:

  • 可突发
  • 可控速
  • 工程常用

3. 限流实现方式

单机限流

  • Guava RateLimiter

  • Resilience4j

分布式限流

  • Redis + Lua

  • 网关限流(Nginx / Gateway)

四、锁 + 限流的真实组合

秒杀系统典型流程:

限流 → 防止冲垮系统 分布式锁 → 防止库存超卖 数据库唯一约束 → 最后兜底

五、你要达到什么程度算掌握?

必会

  • Redis 锁原理
  • NX PX 含义
  • UUID 作用
  • 令牌桶思想

加分

  • Lua 解锁
  • 网关限流
  • Redisson

六、面试标准回答

分布式锁常用 Redis 实现,通过 SET key value NX PX ttl 保证原子性与自动过期,value 使用 UUID 防止误删,解锁用 Lua 保证原子操作。
限流常用令牌桶算法,可在网关或服务层实现,用于削峰与保护下游系统。

七、一句话总结

分布式锁解决“抢同一资源”的问题,
限流解决“来太多人”的问题。

当你理解这一课,你的思维已经从“写接口”升级到“设计系统”。

下一篇:

第十六课实战:分布式锁与限流设计 —— 从原理到可跑 Demo

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/19 8:14:50

Qwen3-4B Instruct-2507一键部署:NVIDIA Jetson Orin Nano边缘设备实测运行

Qwen3-4B Instruct-2507一键部署:NVIDIA Jetson Orin Nano边缘设备实测运行 想在一台小小的边缘设备上,运行一个能流畅对话、帮你写代码、做翻译的AI助手吗?听起来可能有点挑战,毕竟大模型通常需要强大的云端算力。但今天&#x…

作者头像 李华
网站建设 2026/3/15 23:14:29

Phi-3-mini-4k-instruct与STM32CubeMX:嵌入式AI开发

Phi-3-mini-4k-instruct与STM32CubeMX:嵌入式AI开发 最近在折腾嵌入式项目,发现一个挺有意思的事儿:现在的小型AI模型已经能直接跑在单片机上了。以前总觉得AI推理是云端或者高性能计算平台的事儿,跟嵌入式设备没啥关系&#xff…

作者头像 李华
网站建设 2026/3/19 20:28:17

掌握4个强力分子对接参数生成技巧:GetBox PyMOL插件全攻略

掌握4个强力分子对接参数生成技巧:GetBox PyMOL插件全攻略 【免费下载链接】GetBox-PyMOL-Plugin A PyMOL Plugin for calculating docking box for LeDock, AutoDock and AutoDock Vina. 项目地址: https://gitcode.com/gh_mirrors/ge/GetBox-PyMOL-Plugin …

作者头像 李华
网站建设 2026/3/30 10:08:20

5分钟玩转CLAP:零样本音频分类入门指南

5分钟玩转CLAP:零样本音频分类入门指南 1. 引言:让AI听懂你的声音描述 你有没有想过,让AI像人一样,只听一段声音,就能告诉你这是什么?比如一段录音,你问AI:“这是狗叫吗&#xff1…

作者头像 李华
网站建设 2026/3/15 12:58:37

Qwen3-ASR效果展示:30+语言识别实测惊艳表现

Qwen3-ASR效果展示:30语言识别实测惊艳表现 你有没有试过把一段带口音的粤语录音丢进语音识别模型,结果它一本正经地告诉你:“我想吃一碗云吞面”——而原话其实是“我想查一下云服务器配置”?又或者,客户打来一通四川…

作者头像 李华
网站建设 2026/3/15 13:01:37

一键体验SiameseUIE:历史与现代人物地点精准抽取

一键体验SiameseUIE:历史与现代人物地点精准抽取 你是不是经常面对一大段文本,想快速找出里面提到的人物和地点,却要手动一个个去筛选?或者在做历史资料整理、新闻分析时,被复杂的人名、地名搞得眼花缭乱?…

作者头像 李华