个人主页北极的代码欢迎来访作者简介java后端学习者❄️个人专栏苍穹外卖日记SSM框架深入JavaWeb✨命运的结局尽可永在不屈的挑战却不可须臾或缺前言黑马点评这个项目已经写完挺长一段时间了里面的内容还是挺多的写的过程也不是很顺很多知识点都挺重要这里我整理了一下这个项目的重点和整体思路可以给大家做一个参考和复习。ps如果想知道详细的原理或者代码可以看看我的专栏黑马点评日记摘要本文总结了黑马点评项目的核心架构与关键技术点。项目基于SpringBootMybatisPlusRedisRedissonMQ构建重点解决了分布式Session、缓存三大问题穿透/击穿/雪崩、高并发秒杀等核心场景。亮点包括Redis实现分布式Session和用户缓存Set结构处理关注/点赞功能ZSet实现排行榜Bitmap优化签到系统Redisson分布式锁MQ异步处理解决秒杀超卖问题。项目涵盖了短信登录、商户查询、社交笔记、优惠券秒杀等模块通过缓存优化、接口限流、异步削峰等手段显著提升系统性能是分布式系统开发的典型实践案例。首先整体的思维导图一、基础架构 全局配置模块其实就是对项目有一个整体的了解分类具体内容核心定位项目底层支撑所有功能的基础技术栈SpringBoot MybatisPlus Redis Redisson MQ全局统一处理全局异常处理器统一捕获业务异常、系统异常返回规范结果响应结果统一封装统一返回码、提示信息、数据体拦截器登录校验拦截未登录请求放行登录、注册接口分布式基础Redis 替代 Tomcat Session实现分布式 Session 共享用户信息缓存到 Redis减少数据库查询ThreadLocal 存储当前登录用户实现全局用户获取主要问题1. 为什么用 Redis 实现分布式 Session问题Tomcat 原生 Session 只在单机有效集群部署时用户登录状态丢失、跳转服务器需要重复登录。解决方案登录成功后将用户信息存入 Redis以 Token 为 Key前端携带 Token 请求拦截器统一从 Redis 获取用户ThreadLocal 存储当前用户实现接口全局无感获取面试加分点减轻服务器内存压力、支持水平扩容、过期自动下线比原生 Session 更适合分布式项目。2. 拦截器为什么不拦截静态资源/登录接口放行登录、注册、验证码接口避免未登录请求被拦截死循环保证游客可访问基础页面。二、用户模块核心登录体系分类具体内容核心业务短信登录、用户管理、关注粉丝短信登录功能重点发送验证码60 秒限流防刷、验证码存入 Redis、设置过期时间登录校验比对 Redis 验证码正确则生成 Token自动注册手机号不存在则自动创建用户会话保持Token 返回前端后续请求携带 Token 认证用户信息管理个人信息查询、修改头像上传文件上传功能关注 / 粉丝功能关注、取关用户查询关注列表、粉丝列表共同关注推荐基于 Redis Set 集合实现高效去重、比对主要问题1. 短信验证码限流核心原理业务痛点恶意刷短信接口、浪费资费、高频攻击。实现方案发送验证码时在 Redis 存入phone:code设置 60s 过期每次请求先判断 Key 是否存在存在直接拒绝实现60秒只能发送一次接口防刷2. 登录/注册一体化设计亮点无需用户主动注册输入手机号验证码即可登录无账号则自动创建账号简化用户操作是主流互联网产品设计思路。3. 关注功能为什么用 SetSet 天然去重防止重复关注支持快速交集查询实现共同关注功能增删查时间复杂度 O(1)性能远高于数据库三、商户模块缓存三大问题核心场景这部分是高难点初学者一开始不太容易理解很容易搞混。核心业务商户查询、缓存优化、分类查询基础功能根据ID查询商户详情分页查询商户列表商户分类查询、热门分类展示缓存经典问题解决项目重中之重缓存穿透查询不存在数据 rarr; 解决方案缓存空值、布隆过滤器缓存击穿热点Key过期瞬间大量请求打库 rarr; 解决方案互斥锁、逻辑过期缓存雪崩大量Key同时过期 rarr; 解决方案TTL随机值、Redis集群、多级缓存缓存更新策略先更新数据库再删除缓存异步更新重难点缓存三大问题缓存穿透、缓存击穿、缓存雪崩原理场景解决方案必须背熟1. 缓存穿透现象请求数据库不存在的数据如恶意ID、负数ID缓存无数据所有请求直接打数据库。解决方案项目实战用缓存空值查询为空Redis缓存null短期过期拦截重复恶意请求布隆过滤器前置拦截不存在的Key彻底杜绝穿透适合大数据量2. 缓存击穿热点Key问题现象热点Key突然过期瞬间海量并发请求直接打崩数据库。两种解决方案互斥锁只有一个请求查数据库其他请求等待安全性高、性能一般逻辑过期项目重点不设置真实过期时间存入过期字段后台异步更新高并发首选无锁高性能3. 缓存雪崩现象大量缓存Key同时过期或Redis宕机大量请求落库。解决方案TTL 随机值避免批量过期Redis集群高可用防止单点宕机多级缓存、服务熔断降级4. 缓存更新策略先更库再删缓存为什么不先删缓存先删缓存会导致并发读脏数据先更新数据库再删除缓存一致性更高是工业级最优方案。ps这里仅仅是大体的总结一下如果想知道具体的实现或者原理可以看我之前的文章高并发秒杀库存超卖与锁机制解析四、探店笔记模块社交核心核心业务发布笔记、点赞、收藏、分页查询笔记基础功能图文笔记发布、图片上传存储笔记详情查询、首页分页流加载点赞功能高频面试点Redis Set存储点赞用户防重复点赞、防取消多次点赞数实时统计点赞排行榜SortedSet实现收藏功能基于Redis实现笔记收藏、取消收藏、收藏列表查询主要问题1. 点赞为什么不用数据库点赞是超高频读写数据库压力大、响应慢Redis读写性能百万级适合高频场景。2. Set结构防重复点赞核心Key笔记IDValue点赞用户ID判断用户是否在Set中存在则取消点赞不存在则点赞完美解决重复点赞、重复取消的BUG3. 点赞排行榜 ZSet 原理以点赞数为 score自动排序无需手动排序实时生成热门笔记榜单五、评论模块核心业务多级评论、分页查询评论发布一级评论针对商户/笔记发布二级回复父子评论结构分页查询评论列表、排序展示关联用户信息展示评论人头像、昵称六、优惠券 秒杀模块高并发核心核心业务普通优惠券、秒杀优惠券、高并发防超卖普通优惠券新增、查询、用户领取、有效期校验秒杀优惠券项目难点库存预加载秒杀开始前将库存写入Redis一人一单Redis判断用户是否已领取限制单用户单次秒杀防超卖Redisson分布式锁 Redis扣减库存削峰填谷RabbitMQ异步下单缓解数据库压力订单超时未支付自动取消、库存回补核心解决问题高并发、超卖、重复下单、数据库压力过大主要问题1.为什么会超卖多线程同时判断库存 0同时扣减数据库事务无法阻止并发并行执行导致库存为负。2. 最终解决方案工业级Redis预减库存拦截90%流量不直接操作数据库Redisson分布式锁保证原子性彻底防超卖一人一单限制Redis标记用户秒杀状态禁止重复抢购RabbitMQ异步削峰秒杀成功后发送消息异步创建订单3. 为什么要用MQ异步下单秒杀瞬时流量极高同步创建订单会直接压崩数据库MQ削峰填谷将瞬时高流量转为平稳流量保证服务可用。4. 订单超时取消机制用户下单未支付定时任务自动关闭订单、归还库存避免库存冻结导致商品无法售卖。psMQ是我们后面要学的是实际业务中用的消息队列七、签到 积分模块Redis高阶用法核心亮点Redis位图、Hash、SortedSet高阶应用用户签到Redis Bitmap位图实现极致节省内存连续签到天数统计、当月签到记录查询积分体系签到送积分、积分累计积分排行榜ZSet有序集合实现实时排名主要问题1. 签到为什么用 Bitmap极致省内存1bit 记录一次签到一年签到仅需几十字节内存远超Hash、String结构。支持快速统计当月签到次数、连续签到天数是Redis经典极致优化案例。2. 积分排行榜 ZSet 优势有序集合自动排序、支持分页、支持实时更新无需数据库排序查询性能碾压DB。Redis 四大核心解决方案 项目性能优化分类具体内容Redis 四大核心解决方案面试必背1. 缓存三大问题穿透、击穿、雪崩的现象 危害 全套解决方案2. 秒杀高并发方案Redis 预减库存 分布式锁 MQ 异步削峰 一人一单3. 分布式 Session 原理 拦截器登录校验流程4. Redis 五大数据结构实战场景String、Set、ZSet、Bitmap、Hash5. 缓存更新策略与数据一致性问题6. 接口限流、防重、防刷实现思路项目性能优化总结查询优化Redis 缓存热点数据减少 DB 查询并发优化分布式锁保证并发安全流量优化MQ 异步削峰抵挡秒杀高流量内存优化Bitmap 签到、Set 去重、ZSet 排序安全优化接口限流、登录拦截、防重复操作结语如果对你有帮助请点赞关注收藏你的支持就是我最大的鼓励