1. 项目背景与目标解析
这个标题透露了两个核心内容:技术复习和算法练习。作为一名经历过校招和跳槽的开发者,我完全理解这种"技术栈复习+算法刷题"组合拳的价值。特别是在准备面试或巩固基础时,这种模式能同时保持工程思维和算法敏感度。
黑马点评作为经典的分布式实战项目,涵盖了Redis、秒杀、分布式锁等高频面试考点。而栈作为基础数据结构,在括号匹配、表达式求值等场景有不可替代性。将两者结合复习,既能检验工程实践能力,又能锻炼算法思维。
2. 黑马点评全量复习方案
2.1 项目架构全景回顾
建议从架构图开始梳理:
- 前端:Vue + ElementUI
- 网关:Spring Cloud Gateway
- 业务服务:
- 用户服务(JWT+Redis存储)
- 店铺服务(MySQL+缓存穿透方案)
- 订单服务(Redis秒杀+分布式锁)
- 中间件:
- Redis(缓存/分布式锁/计数器)
- RabbitMQ(异步下单)
- Nginx(负载均衡)
2.2 核心考点深度复盘
缓存策略:
- 缓存穿透:布隆过滤器+空值缓存
- 缓存雪崩:随机过期时间+多级缓存
- 缓存击穿:互斥锁实现(注意锁续期问题)
秒杀系统:
// 典型Redis秒杀扣减库存逻辑 Long stock = redisTemplate.opsForValue().decrement("seckill:stock:" + skuId); if (stock < 0) { redisTemplate.opsForValue().increment("seckill:stock:" + skuId); throw new RuntimeException("库存不足"); }分布式锁演进:
- 原生Redis锁(setnx)
- Redisson可重入锁
- RedLock多实例锁
特别注意锁的TTL设置要大于业务执行时间
2.3 实战调试技巧
建议用Arthas进行线上问题复现:
watch com.example.service.impl.* * '{params,returnObj,throwExp}'监控方法入参和返回值trace com.example.controller.* * '#cost>100'追踪慢请求
3. 栈算法精讲与实战
3.1 栈的特性与应用场景
栈的典型应用模式:
- 最近相关性:括号匹配/函数调用
- 顺序反转:链表反转/二叉树遍历
- 临时存储:DFS搜索/表达式计算
3.2 LeetCode经典题解
题目1:有效的括号(20题)
def isValid(s: str) -> bool: stack = [] mapping = {')': '(', '}': '{', ']': '['} for char in s: if char in mapping: top = stack.pop() if stack else '#' if mapping[char] != top: return False else: stack.append(char) return not stack题目2:每日温度(739题)
单调栈解法:
public int[] dailyTemperatures(int[] T) { int[] ans = new int[T.length]; Deque<Integer> stack = new ArrayDeque<>(); for (int i = 0; i < T.length; i++) { while (!stack.isEmpty() && T[i] > T[stack.peek()]) { int prev = stack.pop(); ans[prev] = i - prev; } stack.push(i); } return ans; }3.3 栈的工程应用实例
场景1:浏览器前进后退
- 使用双栈实现:
- 栈A:已访问页面
- 栈B:后退缓存
- 前进操作:栈B.pop() -> 栈A.push()
- 后退操作:栈A.pop() -> 栈B.push()
场景2:撤销操作实现
class CommandStack { private undoStack: Command[] = []; private redoStack: Command[] = []; execute(cmd: Command) { cmd.execute(); this.undoStack.push(cmd); this.redoStack = []; } undo() { const cmd = this.undoStack.pop(); if (cmd) { cmd.undo(); this.redoStack.push(cmd); } } }4. 复习方法论与时间规划
4.1 高效复习时间表
推荐番茄工作法:
- 25分钟专注复习 + 5分钟休息
- 每个番茄钟专注单一模块(如Redis/MySQL/栈算法)
- 每日完成8个番茄钟(约4小时有效学习)
4.2 知识留存技巧
- 费曼学习法:尝试向虚拟听众讲解知识点
- 错题本机制:记录调试过程中的非常规问题
- 可视化笔记:用思维导图连接相关知识点
4.3 面试模拟策略
建议录制视频回答以下问题:
- 如何设计一个分布式ID生成器?
- Redis持久化机制有何优劣?
- 用栈实现队列的时间复杂度是多少?
5. 常见问题排查手册
5.1 项目调试问题
问题1:缓存与数据库不一致
- 检查双写事务是否完整
- 确认缓存过期时间设置合理
- 使用canal监听binlog进行补偿
问题2:秒杀超卖
// 错误示例:非原子操作 Integer stock = redisTemplate.opsForValue().get("stock"); if (stock > 0) { redisTemplate.opsForValue().set("stock", stock - 1); } // 正确应使用Lua脚本保证原子性5.2 算法调试技巧
栈溢出排查:
- 检查递归终止条件
- 使用尾递归优化
- 改为显式栈实现
边界case示例:
- 空输入处理
- 极值测试(如10^5个元素)
- 非法字符检测
6. 技术延伸学习路径
6.1 分布式系统进阶
推荐学习资料:
- 《数据密集型应用系统设计》
- MIT 6.824分布式系统课程
- Redis源码分析(特别是dict和skiplist实现)
6.2 算法能力提升
专项训练建议:
- 单调栈:接雨水、柱状图最大矩形
- 栈应用:逆波兰表达式、最小栈
- 系统设计:LRU缓存实现
6.3 性能优化方向
值得关注的指标:
- Redis QPS(单机通常5w+/s)
- GC停顿时间(CMS/G1对比)
- 算法时空复杂度权衡
在实际复习过程中,我发现用Anki制作记忆卡片效果显著。特别是对于Redis的8种数据结构及其时间复杂度,通过间隔重复能形成长期记忆。另外在刷栈相关题目时,坚持手写实现而不仅依赖IDE,能暴露出很多边界条件处理的问题。