黑马点评-分布式锁-秒杀优化思路
意思是本来是等待一切数据都准备好在哪返回给前端,优化后是先redis判断,一单成功下单就先给前端返回成功,具体的订单数据异步完成。是这个意思吗
完全正确,就是这个核心逻辑,我再帮你补全细节、区分边界,加深理解:
一、新旧流程对比
- 原同步方案用户请求 → 查 Redis / 数据库 → 判库存、判一人一单 → 扣数据库库存、创建订单(慢操作)→ 全部做完才返回结果给前端。👉 前端全程阻塞等待,并发高时响应慢、数据库压力大。
- 优化后异步方案用户请求 → Redis+Lua 原子校验(库存、是否重复下单)→ 校验通过立刻返回「抢购成功 + 订单 ID」给前端;同时把下单任务丢进阻塞队列 → 后台线程慢慢执行数据库扣库存、落订单。👉 前端无需等待数据库操作,响应极快;Redis 扛住高并发,队列削峰保护数据库。
二、补充两个关键细节
- 返回的 “成功” 是什么?前端拿到的只是「秒杀资格校验通过」,不代表数据库订单一定最终落地。极端情况(比如后续数据库故障)可能出现:前端显示抢购成功,但实际没生成订单。所以业务上一般会做订单查询接口,前端拿到订单 ID 后,轮询查询订单状态,确认最终结果。
- Lua 的作用不可少库存扣减、标记用户已下单这两步,必须靠 Lua 保证原子性。如果拆成多条 Redis 命令,高并发下依然会出现超卖、一人多单问题。
- 阻塞队列的作用起到流量削峰:瞬间海量秒杀请求被 Redis 拦截过滤,合法请求进入队列排队,数据库以平稳速度消费,不会被突发流量打垮。