Spring + Redis 学习计划 V3.1(7天闭环,基于AI)

这篇文章不是 Spring 或 Redis 的教程,而是我在学习过程中逐步形成的一套“以实践触发问题、以问题反推原理”的学习方法论记录。然后和 AI 讨论,让 AI 帮我制定并反复修改的一份学习计划。

这份计划并不是一成不变的清单,而是一个可以根据个人基础和时间不断调整的框架。

如果你打算使用这份计划,建议每天只关注一个问题,不要试图一次性学完所有原理;当你能结合代码回答当天的核心问题时,就可以进入下一天。

每天固定产出:代码(可复现)+ 触发问题(至少1个)+ 博客(面试答案)
Spring 的 6 问法继续用;Redis 也用同样的“是否学够了”问法。


Day 1:IOC(不该用 Spring 的场景)

主问题(Spring 6问 #1):我什么时候不该用 Spring IOC?

练习:纯 Java new vs Spring 管理 Bean(最小项目)
触发问题:工具类要不要交给 Spring?过度工程化的代价是什么?
博客:《我什么时候不该用 Spring?IOC 的边界》

原理后置:Bean 生命周期细节、三级缓存(先不看)


Day 2:DI(注入失败与选择规则)

主问题(Spring 6问 #3):DI 为什么会失败?

练习:多实现类 + @Autowired 不加 @Qualifier,制造 NoUnique
触发问题:Spring 如何选择 Bean?为什么字段注入更“坑”?
博客:《@Autowired 注入失败的真实原因与修复姿势》

原理后置:装配算法细节(按需)


Day 3:AOP(为什么会失效)

主问题(Spring 6问 #3/#4):AOP 在哪些情况下会失效?是框架问题还是使用问题?

练习:private / 本类自调用 / final 类方法(任选两种复现)
触发问题:Spring 拦截的是谁?为什么必须经过代理?
博客:《AOP 失效:你以为拦截了方法,其实你绕过了代理》

原理后置:JDK vs CGLIB(只记结论即可)


Day 4:事务(事务不是关键字)

主问题(Spring 6问 #3/#6):事务为什么失效?事务边界在哪里?

练习:@Transactional + try-catch + 自调用(至少复现一个失效)
触发问题:为什么 catch 了异常不回滚?为什么自调用不生效?
博客:《@Transactional 失效三件套:自调用 / 私有方法 / try-catch》

原理后置:传播行为枚举(后置到面试前)


Day 5:Spring Boot(减法实验:自动配置到底做了啥)

主问题(Spring 6问 #2):Boot 帮我解决了什么?又引入了什么新复杂度?

练习:搭 Boot + MVC + MyBatis + JUnit,刻意删配置观察还能跑什么
触发问题:Tomcat 谁起的?Mapper 谁扫的?
博客:《我删了配置还能跑:Spring Boot 自动配置的边界》

原理后置:自动配置源码(先别啃)


Day 6:Redis 进场(Cache Aside + 一致性“必踩坑”)

从今天开始,Redis 用同样的“6问法”(尤其是:何时不用、不可避免的不一致、补救策略)

主问题(Redis 自测 #2/#3):Redis 与数据库不一致我能不能接受?延迟双删在解决什么?

练习(强工程化)

  • 先写 无缓存:Controller → Service → MyBatis → DB
  • 再加 旁路缓存 Cache Aside
    • 读:先查 Redis,miss 查 DB 回填
    • 写:更新 DB + 删除缓存(或先删后更),两种都做
  • 刻意制造并发读写(哪怕用两个线程/两次请求)

必须触发的问题(至少一个)

  • 更新 DB 后,读到 Redis 旧值:这允许吗?怎么兜底?
  • 先删缓存还是先更新 DB?各自会出什么问题?
  • 延迟双删的意义是什么?它是在补什么洞?

博客(面试级)
《Cache Aside 不是“套路”:我如何复现并解释一次读到旧值》

原理后置:Redis 持久化/集群(先不学)


Day 7:Redis × 事务 × AOP(把 Spring 的问题“放大”)

主问题(Spring 6问 #6 + Redis 自测 #4):Redis 操作失败,事务该不该回滚?边界在哪里?

练习(触发更高级问题)

  • 写一个“下单/扣库存”伪业务:
    • DB:扣库存/写订单(事务内)
    • Redis:删缓存/更新缓存(事务内外各做一版)
  • 人为制造 Redis 异常(比如断开连接/抛 RuntimeException)

必须触发的问题

  • DB 回滚了,Redis 没回滚怎么办?
  • Redis 写成功了,DB 失败了怎么办?
  • 缓存更新到底该放在事务前、事务中、事务后?

博客(面试级)
《Redis 进事务是灾难吗?我用一次“回滚不一致”把边界讲清楚》

原理后置(可选进阶):

  • Lua 原子性(如果你想走并发方向,可以作为加分项)