说到秒杀系统,总让人头疼的是库存超卖和响应变慢,库存不够,用户却挤破了头。传统做法是走数据库,查库存扣库存,写订单,这一套流程慢且风险高,稍微有个卡顿就容易出错。要想解决这个问题,咱们得动点脑子,把“扣库存”的动作放到缓存里去,再给订单落库的事儿交给队列去异步处理,这样让Redis先扛住流量,数据库只要负责记结果就行。 核心思路就是三步走:第一步先把库存搬进Redis,系统启动时就把商品数量读进去,存成库存键,以后所有扣减操作都在内存里完成。第二步是客户端发起抢购时,先拿Redis的decrement减库存:减完的值大于0,说明还有货,就把请求扔进队列;减完的值小于等于0,直接告诉用户没货了。第三步就是队列慢慢消费请求,一边查数据库扣库存一边生成订单。 用Spring Boot加Redis跑一个Demo特别简单。启动类里加个@PostConstruct方法把库存塞到Redis里:用redisTemplate.opsForValue().set存个100。消息队列用Redis自带的List就行,生产者LPUSH,消费者BRPOP。写个接口模拟高并发抢购:用ExecutorService秒开一万个线程去访问seckill接口。接口里用redisTemplate.opsForValue().decrement减库存,减完大于0就往队列里rightPush一个随机字符串。 压测一下1万次请求看看效果。压测工具跑起来后台也就记录了10条落库订单,说明超卖的问题解决了。Redis负责扣减库存卡住了大量请求。真实业务里还得加上限流、容错这些功能才行。 最后总结一下Redis秒杀三板斧:缓存前置、预减库存、异步落库。把这三步跑顺了就能在流量洪峰里稳住阵脚。