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

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

十、一句话收尾

锁解决"抢同一资源",

限流解决"来太多人"。

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

相关推荐
若水不如远方8 小时前
分布式一致性(三):共识的黎明——Quorum 机制与 Basic Paxos
分布式·后端·算法
luffy54599 小时前
windows下通过docker-desktop创建redis实例
windows·redis·docker·容器
时艰.9 小时前
java性能调优 — 高并发缓存一致性
java·开发语言·缓存
会算数的⑨9 小时前
Kafka知识点问题驱动式的回顾与复习——(一)
分布式·后端·中间件·kafka
张小凡vip9 小时前
Kafka--使用 Kafka Connect 导入/导出数据
分布式·kafka
回忆是昨天里的海9 小时前
kafka概述
分布式·kafka
知识即是力量ol9 小时前
初识 Kafka(一):分布式流平台的定义、核心优势与架构全景
java·分布式·kafka·消息队列
静听山水9 小时前
Redis的Pipeline (管道)
数据库·redis·php
nbsaas-boot9 小时前
Pipeline + Saga 分布式扩展规范
分布式