java高并发高可用场景解决方案

AgenticCoding·十二月创作之星挑战赛 10w+人浏览 334人参与

相信大部人初级开发跟我一样,平时接触不到什么高并发场景,虽然也能花心思做,但总是受困于杀鸡用牛刀或工资配不上努力或没时间等。故本人整理一份分场景的高并发解决方案,也会包括高可用场景。

高并发场景

高并发秒杀

下单

第一阶段:抗住流量(漏斗模型)

秒杀的本质是“大流量漏斗”。

  • 用户请求: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)
--
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值