如果去招聘网站搜索高级后端工程师的职位,你不难发现,任职要求中大概率会提到缓存。比如,在快手 Java 后端工程师的 JD 中,就有这么一条,“有 3 年以上后台开发经验,理解 IO、多线程、集合等基础框架,熟悉缓存、消息队列等中间件技术,在实际项目有丰富经验”。
显然,缓存技术已成为互联网公司的标配,能不能用好缓存,是工程师到架构师的铺路石,也是一个优秀工程师的试金石。我知道,提到缓存,很多人马上脱口而出 Redis,紧接着就开始说各种奇淫技巧。但事实上,缓存不仅限于此。
从我角度看,要学好缓存技术,首先要有系统思维,不能一上来就钻到某个技术细节中。你要先理解缓存的演进逻辑,及缓存中间件的基本原理和运行逻辑。其次,你得了解所有缓存技术的概况,及其适用场景,比如:Java 技术栈里选择客户端缓存,是 Ehcache,Guava Cache 还是 Spring Cache?为什么?
最后,在理解原理的基础上,你要对一些缓存使用中的关键问题有自己的理解,及对应的解决方案,比如最常见的缓存穿透和雪崩问题,你有没有经过考验的优秀解决方案?再比如 Session 共享的方案,如何用缓存做?这些都是实际工作中要直面的问题,解决了这些问题,你才敢说懂缓存。
我最早接触缓存是在 2005 年,说实话,这么多年,见过了太多缓存技术。相应地,在工作中,我也见过很多因缓存设计不当而产生的问题。比如:
- 在某个秒杀项目中,使用缓存来保存库存信息,因为选错了缓存框架,不仅性能无法提升,最后了引发了库存数据的不一致问题;
- 在某个电商项目中,用缓存保存了一些常用配置信息,但在监控缓存使用的过程中,却发现命中率非常低;
- 在某个在金融项目,在更改了数据库中的某些配置后,缓存不仅没有得到更新,还导致了某些与钱相关的生产事故。
好了,不卖关子了。我想,对于缓存,你肯定会有很多疑惑。在我和极客时间合作的视频课《分布式缓存高手课》中,我会讲解常见缓存框架的实现原理和技术选型,并根据 JSR 107 规范,手把手带你实现一个缓存框架,了解穿透、并发、雪崩的规避与解决方案。通过支付、秒杀等场景下的实战案例,带你最大程度发挥缓存在项目中的效能,搞定工作中 90% 缓存应用场景。


