第十六课实战:分布式锁与限流设计 —— 从原理到可跑 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 原子校验;

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

十、一句话收尾

锁解决"抢同一资源",

限流解决"来太多人"。

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

相关推荐
深蓝电商API7 小时前
分布式事务在跨境交易中的解决方案
分布式·跨境电商·代购系统·反向海淘·代购平台·跨境代购
wyt5314299 小时前
Redis的安装教程(Windows+Linux)【超详细】
linux·数据库·redis
vpk1129 小时前
Docker Compose 安装 Redis
redis·docker·容器
我真会写代码11 小时前
从入门到精通:Kafka核心原理与实战避坑指南
分布式·缓存·kafka
我真会写代码12 小时前
Redis高频面试题(含标准答案,覆盖基础+进阶+实战)
数据库·redis·缓存
黄俊懿12 小时前
【架构师从入门到进阶】第二章:系统衡量指标——第一节:伸缩性、扩展性、安全性
分布式·后端·中间件·架构·系统架构·架构设计
一叶飘零_sweeeet13 小时前
击穿 Kafka 高可用核心:分区副本、ISR 机制与底层原理全链路拆解
分布式·架构·kafka
6+h13 小时前
【Redis】缓存问题及解决方案
数据库·redis·缓存
6+h14 小时前
【Redis】高可用核心讲解
数据库·redis·缓存
007张三丰14 小时前
常用缓存技术全方位解析:从本地缓存到分布式缓存
分布式·缓存