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

学完分布式锁和限流,如果没有实战,你只是"知道"。

跑过一遍 Demo,你才是"会用"。

本文目标:

Spring Boot + Redis 做一个最小实战,验证三件事:

  1. 没有锁会并发冲突
  2. 有锁但不校验 UUID 会误删
  3. 正确锁(UUID + 原子解锁)才安全
  4. 再加一层限流,形成"门禁系统"

一、实验场景设计

我们模拟一个经典业务:扣库存

特点:

  • 并发高
  • 容易超卖
  • 非常适合验证锁

资源:

复制代码
商品ID:sku=1001
初始库存:1

二、实验环境

学习阶段一台电脑就够:

  • 本机 Redis(或 Docker Redis)

  • 两个 SpringBoot 实例

  • localhost:8080

  • localhost:8081

这两个实例共用一个 Redis,

就等价于"两台服务器"。

三、第一步:没有锁的情况

接口逻辑(伪代码):

复制代码
if stock > 0:
    stock--

并发请求时可能出现:

复制代码
库存=1
A读取=1
B读取=1
A扣减=0
B扣减=0

结果:超卖

四、第二步:加锁但错误解锁

加锁:

复制代码
SET lock:sku:1001 uuid NX PX 30000

解锁:

复制代码
DEL lock:sku:1001

风险场景:

  • A 执行慢
  • 锁过期
  • B 拿锁
  • A 执行完直接 DEL
  • 把 B 的锁删了 ❌

五、第三步:正确分布式锁

加锁

复制代码
SET lock:sku:1001 uuid NX PX 30000

关键点:

  • NX:不存在才设置
  • PX:过期时间
  • uuid:锁身份

解锁(Lua 原子)

逻辑:

复制代码
如果当前 value == 我的 uuid
    删除
否则
    不删除

意义:

  • 防误删
  • 防并发插队

六、加入限流 ------ 门口再加一道闸

为什么要限流?

锁解决的是"同一资源冲突",

限流解决的是"人太多把系统打爆"。

最简单限流思路

每秒最多 5 次请求:

复制代码
key = limit:api:stock
count++
过期1秒
>5 拒绝

七、最终完整流程

复制代码
请求进来
   ↓
限流(挡住洪水)
   ↓
分布式锁(保护资源)
   ↓
业务执行
   ↓
UUID 原子解锁

这就是一个最小的 并发门禁系统

八、你通过实战能学到什么?

能力 价值
Redis 锁机制 企业级并发思维
UUID 解锁 防误删
Lua 原子操作 工程严谨性
限流设计 系统保护意识
多实例模拟 分布式思维

九、面试一句话总结

分布式锁用 Redis SET NX PX 实现,加 UUID 防误删,解锁用 Lua 原子校验;

限流用计数器或令牌桶算法保护系统,两者结合形成并发门禁机制。

十、一句话收尾

锁解决"抢同一资源",

限流解决"来太多人"。

两者结合,你才真正具备并发系统设计能力。

相关推荐
jran-2 小时前
Redis 命令
数据库·redis·缓存
189228048612 小时前
NY382固态MT29F32T08GSLBHL8-24QM:B
大数据·服务器·人工智能·科技·缓存
GIS数据转换器3 小时前
农村生活污水治理智慧管控平台
大数据·人工智能·分布式·数据分析·生活·智慧城市
June`3 小时前
多线程redis下如何解决aof重写和rdb持久化的数据一致性问题
数据库·redis·缓存
Trouvaille ~4 小时前
【Redis篇】初识 Redis:特性、应用场景与版本演进
数据结构·数据库·redis·分布式·缓存·中间件·持久化
cd_949217215 小时前
鸿蒙系统下抖音存储空间不足怎么办?缓存清理教程
缓存·华为·harmonyos
米高梅狮子6 小时前
Ceph 分布式存储 部署
linux·运维·数据库·分布式·ceph·docker·华为云
郭龙_Jack6 小时前
跨境电商 平台 - ERP - 内部子系统 交互方式总图
分布式·教育电商
喝醉酒的小白6 小时前
Kafka 集群应急故障排查手册
分布式·kafka
无籽西瓜a6 小时前
【西瓜带你学Kafka | 第八期】 Kafka的主从同步、消息可靠性、流处理与顺序消费(文含图解)
java·分布式·后端·kafka·消息队列·mq