前言作为Java后端开发者黑马点评几乎是所有人从“CRUD新手”迈向“高并发实战”的分水岭项目。在学习黑马点评之前我写代码停留在- 只会写普通CRUD接口- 只会用MySQL做数据存储- 不懂缓存、不懂并发、不懂分布式问题- 遇到高并发、超卖、缓存失效、会话丢失完全无从下手完成黑马点评项目之后我真正打通了 SpringBoot MyBatis-Plus Redis 消息队列 分布式锁 多级缓存 的完整技术闭环。本项目基于大众点评真实业务模型复刻了企业级本地生活平台核心业务短信登录、商户缓存、高并发秒杀、用户关注、点赞排行、附近商户、签到统计、UV统计等模块。本文将万字完整复盘黑马点评所有知识点、踩坑记录、底层原理、优化方案、面试考点与简历包装思路适合所有Java后端初学者收藏复盘。项目架构图黑马点评项目采用经典的三层架构设计清晰分离前端展示、业务逻辑与数据存储确保系统的高可用、高并发与可扩展性。以下是整体架构图flowchart TD subgraph A[前端层] A1[用户浏览器/App] A2[页面请求] A3[交互与秒杀下单] end subgraph B[业务服务层] B1[拦截器] B2[登录校验] B3[业务逻辑处理] B4[分布式锁] B5[消息队列生产者] end subgraph C[数据存储层] C1[MySQL 持久化存储] C2[Redis 缓存/会话/队列] C3[RabbitMQ 异步解耦] end A --gt;|HTTP/HTTPS请求| B B1 --gt;|Token校验| B2 B2 --gt;|用户信息| B3 B3 --gt;|读请求优先| C2 B3 --gt;|写请求| C1 B3 --gt;|高并发写| B5 B5 --gt;|异步消息| C3 C3 --gt;|消费者处理| C1 C2 --gt;|缓存未命中| C1 C1 --gt;|数据回写| C2/code/pre 架构说明 前端层负责用户界面展示、页面请求发起和秒杀下单等交互操作通过HTTP/HTTPS协议与后端服务通信。 业务服务层核心业务处理层包含拦截器统一鉴权、登录校验分布式会话、业务逻辑处理商户查询、秒杀等、分布式锁防超卖和消息队列生产者异步削峰。 数据存储层MySQL负责持久化存储核心业务数据Redis作为高速缓存存储会话、热点数据、分布式锁和计数器RabbitMQ用于异步解耦将高并发写操作转化为队列任务保护数据库。 该架构体现了“读多写少场景全部缓存化、高并发写场景全部异步化、分布式问题全部中间件化解决”的核心设计思想。一、项目整体介绍1.1 项目定位黑马点评是前后端分离的本地生活服务后端项目对标大众点评、美团商户点评系统。核心业务场景- 用户短信登录、登录状态持久化- 商户查询、商户缓存加速- 优惠券秒杀高并发场景- 用户关注、取关、共同关注- 探店笔记发布、点赞、点赞排行榜- 用户连续签到统计- 基于地理位置的附近商户查询- 页面UV独立访客统计1.2 技术栈纯正版无魔改后端核心技术- SpringBoot 2.7- MyBatis-Plus- MySQL 8.0- Redis 6.2- Redisson分布式锁- RabbitMQ消息异步削峰- Lua脚本Redis原子操作- Caffeine本地二级缓存- JWT、ThreadLocal、拦截器1.3 项目架构设计整体架构分为三层1. 前端层页面请求、交互、秒杀下单2. 业务服务层接口拦截、登录校验、业务逻辑处理3. 数据存储层MySQL持久化、Redis缓存、MQ异步解耦核心设计思想读多写少场景全部缓存化、高并发写场景全部异步化、分布式问题全部中间件化解决。二、模块一分布式短信登录从Session痛点到Redis会话2.1 原生Session存在的致命问题初学Java Web时我们依赖Tomcat Session存储用户登录信息。但集群部署下存在致命缺陷- 多台Tomcat服务器 Session不共享- 用户第一次访问服务器A登录第二次负载均衡到服务器B → 登录状态丢失- 无法水平扩展完全不适合线上集群环境2.2 黑马解决方案Redis实现分布式Session核心思路1. 用户登录成功后生成随机Token作为令牌2. 将用户信息序列化存入Redis设置过期时间3. Token返回前端前端每次请求携带Token4. 拦截器拦截所有请求根据Token从Redis获取用户5. 存入ThreadLocal供全局业务使用2.3 关键优化点1. ThreadLocal存储用户信息避免Controller、Service层层传参实现全局用户透明获取。2. 登录状态自动续期每次访问接口刷新Redis Key过期时间实现“活跃用户永久在线”。3. 短信验证码限流利用Redis自增计数器限制1分钟最多发送1次验证码防刷接口。2.4 面试高频问题1. 为什么不用JWT纯令牌方案JWT无法主动失效不适合单点登出、踢下线场景Redis会话可随时删除可控性更强。2. ThreadLocal会内存泄漏吗项目拦截器请求结束必须remove用户信息否则线程池复用会导致脏数据。三、模块二商户查询缓存彻底吃透Redis缓存三大问题这是黑马点评最核心、最基础、面试问得最多的模块。3.1 业务痛点商户查询属于典型读多写少场景- 数据库查询压力大- 重复查询相同商户SQL浪费资源- 高并发场景数据库极易被打挂因此必须引入Redis缓存优化查询。3.2 基础缓存流程1. 查询商户 → 先查Redis2. 命中直接返回3. 未命中查询MySQL4. 查询完毕写入Redis下次直接缓存命中3.3 缓存更新策略企业标准更新数据库 → 删除缓存为什么不更新缓存- 频繁更新会导致大量无效缓存写入- 删除缓存更轻量、更一致性3.4 三大缓存问题完整解决方案面试必背1缓存穿透问题查询不存在数据Redis、MySQL都查不到请求直接打数据库。解决方案空值缓存不存在的商户也缓存空数据设置短期TTL拦截大量恶意空查询。2缓存雪崩问题大量缓存Key同时过期瞬间全部请求打数据库。解决方案TTL随机值给缓存过期时间增加随机偏移量避免批量Key同时失效。3缓存击穿热点Key问题问题超级热点商户缓存过期瞬间海量并发直接打数据库。黑马提供两套企业级方案方案1互斥锁保证一致性、牺牲性能缓存失效时只放行一个线程查数据库其他线程阻塞等待缓存重建完成。方案2逻辑过期保证高性能、弱一致性热点数据提前设置逻辑过期字段- 未过期直接返回旧缓存- 已过期异步线程重建缓存用户依旧返回旧数据零阻塞、超高并发3.5 项目进阶亮点CaffeineRedis二级缓存我在本项目完全落地企业二级缓存架构1. 一级缓存Caffeine本地缓存JVM内存- 无网络IO、速度极快- 拦截80%热点请求2. 二级缓存Redis分布式缓存- 保证集群数据共享优势- 大幅减少Redis访问次数- 降低网络开销- 极大提升QPS四、模块三高并发优惠券秒杀项目天花板、面试重中之重秒杀是后端最经典高并发场景黑马点评秒杀模块涵盖几乎所有并发问题。4.1 秒杀原生问题1. 库存超卖多线程同时扣减库存库存负数2. 一人多单用户重复秒杀3. 数据库压力巨大大量请求直接落库4. 同步下单阻塞严重响应慢、超时多4.2 阶段一Redis预扣库存解决超卖利用Redis原子操作判断库存、扣库存。问题多条Redis命令不保证原子性依旧超卖。4.3 阶段二Lua脚本保证绝对原子性将判断库存 扣库存 判断用户是否已秒杀三条逻辑写在同一个Lua脚本Redis单线程执行Lua彻底杜绝超卖。4.4 阶段三Redisson分布式锁实现一人一单单机synchronized无法集群生效。使用Redisson分布式锁- 锁定用户ID- 保证同一个用户只能创建一单- 解决集群环境重复秒杀问题4.5 阶段四RabbitMQ异步削峰最终企业方案流程最终优化为1. 前端秒杀请求2. Redis Lua预扣库存、校验资格3. 秒杀成功发送消息到MQ4. 前端直接返回排队成功5. 消费者异步创建订单、落库优势- 秒杀请求毫秒级响应- 彻底削峰不压垮数据库- 支持超大流量秒杀场景4.6 秒杀完整链路总结限流 → 缓存预扣 → Lua原子校验 → 分布式锁防重 → MQ异步落库这就是真实互联网秒杀架构雏形。五、模块四Redis高阶数据结构实战面试加分大招黑马点评最大亮点把Redis所有高频数据结构全部落地业务5.1 String- 分布式登录会话- 验证码存储、限流计数5.2 Hash- 用户信息缓存、商户信息缓存5.3 Set- 用户关注列表- 共同好友求取Set交集5.4 ZSet有序集合- 探店笔记点赞排行榜- 按点赞数自动排序5.5 BitMap- 用户签到统计极大节省内存千万用户签到仅几MB内存5.6 GeoHash- 经纬度计算- 附近商户距离排序、范围查找5.7 HyperLogLog- 页面UV独立访客统计极小内存实现亿级UV统计学完本项目你再也不是只会set/get的Redis新手而是懂场景、懂选型、懂优化的实战开发者。六、模块五社交业务关注、点赞、排行、探店笔记6.1 用户关注与共同关注核心- Set存关注用户- Set交集求共同关注6.2 点赞功能防重复利用Redis Set唯一性- 存点赞用户ID- 判断是否存在实现不可重复点赞6.3 点赞排行榜ZSet score点赞数自动排序实时榜单。6.4 探店笔记异步发布采用MQ异步发布笔记减少主线程压力提升接口速度。七、模块六性能优化与架构思维升华7.1 所有读请求优先缓存MySQL只做兜底持久化。7.2 所有高并发写请求异步化避免同步阻塞、避免数据库压力堆积。7.3 所有热点数据内存化本地缓存 分布式缓存双层兜底。7.4 所有并发问题原子化Lua、分布式锁解决并发安全。八、学习本项目前后能力对比学习前- 只会普通CRUD- 不懂缓存原理- 不懂并发安全- 不懂分布式问题- 面试只会背概念无实战支撑学习后- 能独立设计缓存架构- 能解决穿透、击穿、雪崩三大经典问题- 能独立开发高并发秒杀系统- 熟练掌握Redis七种数据结构真实业务场景- 掌握分布式锁、会话共享、异步削峰- 具备企业级后端业务设计思维这就是校招面试官最想看的实战能力九、项目踩坑记录真实开发问题1. 缓存更新策略错误导致数据不一致未采用删缓存而是更新缓存引发脏数据。2. 秒杀不加锁导致超卖普通Java锁无法集群生效。3. 不用Lua脚本导致原子性失效4. ThreadLocal不清除导致内存泄漏5. 热点Key无逻辑过期导致数据库瞬间压力暴涨6. TTL固定值引发缓存雪崩隐患所有坑全部在项目中手动踩过、修复过、理解透彻。十、简历标准包装文案项目名称黑马点评本地生活商户平台技术栈SpringBoot、MyBatis-Plus、MySQL、Redis、Redisson、RabbitMQ、Lua、Caffeine项目描述独立复刻仿大众点评本地生活后端项目实现分布式短信登录、商户多级缓存、高并发优惠券秒杀、用户社交关注、点赞排行、附近商户、签到UV统计等核心业务。通过多级缓存、异步削峰、分布式锁、Lua原子脚本解决海量查询与秒杀并发问题具备完整互联网高并发项目架构思维。核心职责1. 基于Redis拦截器ThreadLocal实现分布式会话登录解决集群会话共享与登录状态刷新问题。2. 搭建Caffeine本地缓存Redis分布式缓存二级架构完整解决缓存穿透、击穿、雪崩三大问题大幅降低DB压力。3. 基于Lua脚本Redisson分布式锁实现高并发秒杀防止库存超卖与用户重复下单结合RabbitMQ异步下单削峰提升系统吞吐量。4. 熟练运用Redis Geo、BitMap、ZSet、HyperLogLog等数据结构实现附近商户、签到统计、点赞排行、UV统计等业务。十一、面试高频10问黑马点评必问1. 缓存穿透、击穿、雪崩分别是什么怎么解决2. 为什么用Redis做分布式Session不用JWT3. 秒杀为什么要用Lua脚本4. 一人一单怎么实现5. 互斥锁和逻辑过期优缺点6. 二级缓存架构优势和数据不一致怎么解决7. RabbitMQ在秒杀中的作用8. 为什么删缓存不更新缓存9. GeoHash原理是什么10. BitMap、HyperLogLog适用场景十二、项目总结与个人感悟黑马点评不是一个简单练手项目它是Java后端从零基础进阶工程化、高并发、分布式的必修项目。完成本项目我真正掌握了- 真实企业缓存架构设计- 高并发秒杀完整解决方案- Redis全场景业务落地- 分布式锁、异步队列工程化使用- 性能优化、并发安全、系统稳定性思维很多人学SpringBoot只会CRUD而我通过黑马点评真正学会了“后端架构”。未来我将继续深入微服务、分布式事务、多级架构、限流熔断持续夯实后端核心竞争力。原创不易欢迎点赞收藏持续更新后端实战系列复盘