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

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

十、一句话收尾

锁解决"抢同一资源",

限流解决"来太多人"。

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

相关推荐
ffqws_10 小时前
redis面试:如何保证双写一致
数据库·redis·缓存
宠友信息14 小时前
MySQL 租户数据隔离在即时通讯源码后端中的落地方式
java·数据库·spring boot·redis·websocket·mysql
吴声子夜歌16 小时前
Redis 5.x——pub/sub和Stream
数据库·redis·bootstrap
吴声子夜歌16 小时前
Redis 5.x——多种数据类型使用场景
数据库·redis
前端Baymax18 小时前
Redis内存暴涨导致服务雪崩
redis
我登哥MVP19 小时前
Hadoop成长史-从Nutch子项目到大数据生态王者
java·大数据·hadoop·分布式·云原生·云计算
凯云-金山HIL20 小时前
打破仿真孤岛:基于凯云SimuRTS的分布式联合仿真系统架构深度解析
自动化测试·分布式·系统架构·etest·半实物仿真
.Cnn20 小时前
Redis基础day02
java·数据库·redis
枫叶丹420 小时前
Loop Engineering:从提示词到循环系统
数据库·redis·缓存·loop
Database_Cool_1 天前
HTAP数据库详解_阿里云PolarDB-X一体化行列存实现实时分析
分布式·阿里云·云计算