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

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

十、一句话收尾

锁解决"抢同一资源",

限流解决"来太多人"。

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

相关推荐
初次攀爬者2 天前
ZooKeeper 实现分布式锁的两种方式
分布式·后端·zookeeper
知我Deja_Vu3 天前
redisCommonHelper.generateCode(“GROUP“),Redis 生成码方法
数据库·redis·缓存
Charlie_lll4 天前
Redis脑裂问题处理——基于min-replicas-to-write配置
redis·后端
奇点爆破XC4 天前
Redis迁移
数据库·redis·bootstrap
断手当码农4 天前
Redis 实现分布式锁的三种方式
数据库·redis·分布式
菜鸟小九4 天前
redis原理篇(基本数据结构)
数据结构·数据库·redis
没有bug.的程序员4 天前
电商秒杀系统深度进阶:高并发流量建模、库存零超卖内核与 Redis+MQ 闭环
数据库·redis·缓存·高并发·电商秒杀·流量建模·库存零超卖
troublea4 天前
ThinkPHP3.x高效学习指南
mysql·nginx·缓存
菜鸟小九4 天前
redis原理篇(五种数据结构)
数据结构·数据库·redis
初次攀爬者4 天前
Redis分布式锁实现的三种方式-基于setnx,lua脚本和Redisson
redis·分布式·后端