并且本地缓存不仅仅只是支持Guava Cache,分布式缓存不仅仅只是支持Redis,在代码层面,都是面向接口编程,而非面向具体实现类编程,不管是本地缓存还是分布式缓存,都可以根据简单的配置切换具体的实现方式 。
7.1 扩展性描述代码具备良好的扩展性,后续维护和升级的成本就比较低 。相反,如果代码写的杂乱无章,犹如“屎山”,那后期维护起来是相当痛苦的 , 谁也不想天天面对着一堆“屎山”,哪来有问题改哪里 。
所以 , 从一开始写的代码就要有良好的扩展性,方便后期的维护和升级 。
假设秒杀系统整体基于SpringBoot+SpringCloud Alibaba技术栈实现,那如何写代码具备良好的扩展性呢?
总体的原则就是面向接口编程,而非面向具体的实现类编程,具体业务逻辑里依赖的是接口,而非实现类 , 在接口不变的前提下,可以随时切换具体的实现类,也可以随时新增接口的实现类 。业务中可以根据配置加载接口的某个具体实现类 。
7.2 本地缓存落地实现本地缓存的落地实现示意图如图8所示 。

文章插图
图片
可以看到 , 具体秒杀业务中会依赖本地缓存的接口,而非具体的实现类 。
本地缓存的接口可以有多个实现类 , 在秒杀业务中可以根据具体的配置项指定要加载并使用哪个实现类,也可以根据具体的需求和业务场景随时新增本地接口的实现类,大大提高了程序的扩展性 。
7.3 分布式缓存落地实现分布式缓存的落地实现示意图如图9所示 。

文章插图
图片
可以看到,分布式缓存在扩展性方面的设计与本地缓存类似 , 同样是秒杀系统在具体业务中依赖分布式缓存的接口,而非分布式缓存的具体实现类 。
分布式缓存的接口可以有多个实现类 , 在秒杀业务中可以根据具体的配置项加载并实例化具体的实现类,也可以根据具体的需求和业务场景新增分布式缓存接口的实现类,提高了实现分布式缓存程序的扩展性 。
八、总结缓存不仅仅可以用来存储热点数据,提升热点数据的读性能,还是业务系统中抗高并发、大流量的利器 。
以秒杀系统为例,采用本地缓存+分布式缓存的混合型缓存方案时,如果整个秒杀系统前置的流量管控、流量清洗和限流等是秒杀系统流量洪峰的第一道防线,则本地缓存就是抗流量洪峰的第二道防线,而分布式缓存就是第三道防线 , 经过层层流量过滤,最终进入数据库的流量就比较可控了 。
同时,引入本地缓存+分布式缓存的混合型缓存方案后,要考虑缓存的刷新机制,数据一致性问题 , 在代码落地的过程中,还要最大程度避免缓存穿透、击穿和雪崩问题,并实现代码的高度可扩展性 。
在提供的开源方案中,已经解决了缓存穿透、击穿和雪崩问题,开源地址如下:
- GitHub:https://github.com/binghe001/spring-redis
- Gitee:https://gitee.com/binghe001/spring-redis
- GitCode:https://gitcode.net/binghe001/spring-redis
【互联网大厂是如何设计和使用缓存的?方案已开源!】
推荐阅读
- 10亿数据如何最快插入MySQL?
- TikTok全托管模式是什么?如何解读新模式
- TikTok如何选品?打造爆款不是梦
- 茶叶是酸性还是碱性的?如果茶叶出现酸味,属于正常现象吗?
- 宇宙基本的理论是不含“长度”和“质量”这些概念的吗?
- 老紫砂壶都是单孔的吗
- 引力波是什么东西?对人类有什么影响?
- 社保卡金融功能未激活,养老金领不到,真的是这样吗?
- 运动产生的多巴胺带来的快乐
- 女性荷尔蒙是什么意思
