一个可真实编译运行的电商秒杀后端作品集项目,围绕「高并发、防超卖、异步削峰、接口安全」完整实现,适合作为简历 / 接单作品展示。
点击空白处退出提示
一个可真实编译运行的电商秒杀后端作品集项目,围绕「高并发、防超卖、异步削峰、接口安全」完整实现,适合作为简历 / 接单作品展示。
Redis Lua 原子预减库存:库存扣减 + 一人一单判断在一段 Lua 脚本中原子完成,避免并发竞态。
RabbitMQ 异步下单削峰:秒杀请求先在 Redis 预减库存,再投递 MQ 立即返回「排队中」,数据库按消费能力平滑落库。
Lua + DB 双重防超卖:Redis 预减之外,落库时用 update ... set stock=stock-1 where stock>0 条件更新兜底;订单表 (user_id, goods_id) 唯一索引保证一人一单。
本地内存售罄标记:ConcurrentHashMap 标记已售罄商品,售罄后直接快速失败,减少无效 Redis 访问。
隐藏秒杀接口地址:秒杀开始后服务端才下发基于 用户+商品+服务端盐 的 MD5 动态 path,接口路径不可提前猜测。
接口防刷:自定义 @AccessLimit 注解 + 拦截器,基于 Redis 计数,按「用户/IP + URL」做时间窗口限流(默认 5 秒 5 次)。
图形验证码:Hutool 生成干扰线验证码,答案存 Redis 一次性校验,阻挡机器人脚本。
死信队列超时关单:下单后发送 30s TTL 延迟消息,未支付订单自动取消并回补 Redis + DB 库存。
登录态鉴权:手机号 + 加盐 MD5 密码登录,token 存 Redis、写入 Cookie,拦截器统一校验。
统一工程规范:Result 统一返回、错误码枚举、@RestControllerAdvice 全局异常处理、SpringDoc 接口文档。
本项目由我独立完成,从需求分析、库表设计、核心编码到 Docker 部署全程一人负责,重点攻克了秒杀场景下的超卖、高并发压垮数据库和接口被刷三大难题。
难点一:高并发下如何彻底防超卖。 我没有用「先查库存再扣减」的非原子写法(并发下必然超卖),而是设计了 Redis Lua 脚本,把判断库存、判断一人一单、扣减库存合并为一次原子操作;数据库层再用 stock_count=stock_count-1 where stock_count>0 条件更新加 (user_id,goods_id) 唯一索引做双重兜底,形成「Redis 预减 + DB 兜底」的完整防线,从机制上杜绝超卖。
难点二:流量瞬时打满如何保护数据库。 引入 RabbitMQ 异步削峰,抢购请求 Lua 预减成功后只发消息、立即返回排队中,把突发流量摊平后由消费者按数据库能承受的速率匀速落库;同时用本地 ConcurrentHashMap 售罄标记,让售罄商品在内存直接失败,最大限度减少 Redis 访问。为应对重复投递,消费端做了幂等处理。
难点三:未支付订单如何自动关单且不丢库存。 我用 TTL + 死信队列实现 30s 延迟关单,订单超时后自动取消、清除已购标记,并把库存精确回补到 Redis 与数据库,保证数据最终一致。
难点四:防刷与鉴权。 自研 @AccessLimit 注解 + 拦截器,基于 Redis 做 用户/IP+URL 时间窗口限流;秒杀接口用动态 MD5 路径隐藏,配合图形验证码和加盐 MD5 登录、Token+Cookie 鉴权,挡住脚本和恶意重放。
整个项目采用三层架构、Result 统一返回与全局异常处理,提供 docker-compose 一键起中间件,已在 JDK8 + Maven 下真实编译打包通过。




评论