相信大部人初级开发跟我一样,平时接触不到什么高并发场景,虽然也能花心思做,但总是受困于杀鸡用牛刀或工资配不上努力或没时间等。故本人整理一份分场景的高并发解决方案,也会包括高可用场景。
高并发场景
高并发秒杀
下单
第一阶段:抗住流量(漏斗模型)
秒杀的本质是“大流量漏斗”。
- 用户请求:1000 万
- 网关层拦截:剩下 100 万
- Redis 扣减:剩下 1 万
- MySQL 下单:剩下 1000(真实的库存数)
如果没有 Redis 在中间挡着,1000 万请求直接打到 MySQL,数据库瞬间爆炸。
第二阶段:核心扣减(Redis + Lua)
这是你问的重点。为什么一定要用 Lua?
1. 为什么不用 Java 代码直接调 Redis?
如果你在 Java 里写:
// ❌ 错误示范:会有并发安全问题
int stock = redis.get("stock:1001");
if (stock > 0) {
redis.set("stock:1001", stock - 1);
return true;
}
问题一(原子性):get 和 set 是两步操作。高并发下,线程 A 读了 1,线程 B 也读了 1,结果两个人都卖出去了,超卖!
问题二(性能):一来一回(RTT)网络请求两次,慢。
2. Lua 脚本登场
Redis 执行 Lua 脚本是原子性的(Atomic)。Redis 把它当做一个命令执行,中间不会被其他命令插入。
标准的秒杀 Lua 脚本:
-- KEYS[1]: 商品库存 Key (stock:1001)
--

最低0.47元/天 解锁文章
10万+

被折叠的 条评论
为什么被折叠?



