最近,有小伙伴私信我:冰哥,我最近出去面试,面试官问我如何设计缓存能让系统在百万级别流量下仍能平稳运行 , 我当时没回答上来 。接着,面试官问我之前的项目是怎么使用缓存的,我说只是缓存了一些数据 。当时确实想不到缓存还有哪些用处,估计这次面试是挂了 。冰哥,你可以给我讲讲互联网大厂项目是怎么设计和使用缓存的吗?
本文缓存方案已经开源,开源地址如下,如果开源方案对你有点帮助或者启发,欢迎在代码仓库给个Star,让更多的小伙伴看到它,互相学习,一起进步 。
- Github:https://github.com/binghe001/spring-redis
- Gitee:https://gitee.com/binghe001/spring-redis
- GitCode:https://gitcode.NET/binghe001/spring-redis
今天,我们就以高并发、大流量业务场景中最具代表性的 秒杀系统 为例,采用市面上大家都比较熟悉的技术,一起探究下 秒杀系统 背后是如何设计和使用缓存的 。
二、秒杀系统缓存核心诉求秒杀系统在承接瞬时高并发流量时 , 如果将流量直接打到数据库,那数据库很有可能因为扛不住瞬间的高并发流量而导致崩溃和宕机 。所以 , 需要对秒杀系统进行极致的缓存设计 , 让大部分流量走缓存 。
同时,在设计缓存架构方案时,为了进一步提升性能,将采用 本地缓存+分布式缓存的混合型缓存 设计方案,让本地缓存抗大部分流量 , 分布式缓存次之,数据库再次之,如图1所示

文章插图
图片
并且针对秒杀系统这种瞬时并发量高的场景,在设计缓存时 , 需要注意的技巧:优先读取本地缓存数据,如果本地缓存失效,则读取分布式缓存数据 , 并且在同一时刻,只能有一个线程更新本地缓存,防止缓存击穿 。
没有获取到本地缓存更新机会的其他线程 , 需要立即返回而不是原地等待 。如果分布式缓存失效时 , 在同一时刻,也只能有一个线程更新分布式缓存,防止缓存击穿 。没有获取到分布式缓存更新机会的线程 , 也需要立即返回而不是原地等待 。
另外,需要注意的是:我们提出了采用 本地缓存+分布式缓存的混合型缓存设计方案 , 后文会着重对这种设计进行说明 。
三、秒杀系统缓存使用场景秒杀系统属于典型的读多写少的高并发系统 , 应对这种场景的一个有效措施就是使用缓存,不管是单机JVM缓存还是以Redis为例的分布式缓存 , 其读写性能都会比数据库高得多 。所以,在秒杀系统中,为了应对高并发、大流量的业务场景 , 缓存自然也就成为建设秒杀系统过程中必不可少的环节 。
3.1 秒杀系统接口分析在秒杀系统中,主要是对一些读数据的接口设计缓存策略,而在这些读数据的接口中,获取秒杀活动列表、获取秒杀活动详情、获取秒杀商品列表和获取秒杀商品详情的接口流量比其他接口高 。
尤其是获取秒杀商品列表和获取秒杀商品详情的接口QPS一般会高于获取秒杀活动列表和秒杀活动详情的接口 , 毕竟大部分用户在秒杀开始前就已经进入到秒杀详情页 , 当然这也不是绝对的 , 还是要看秒杀系统对于这些接口的设计 。
3.2 秒杀系统缓存场景尽管获取秒杀商品列表和获取秒杀商品详情的接口QPS一般会高于获取秒杀活动列表和秒杀活动详情的接口 。
但是我们在设计缓存时,需要对这些接口一视同仁,都要以严格的高标准来设计这些接口 , 不然稍有不慎,一个接口出现问题,就可能导致整场秒杀活动以失败告终 。秒杀系统缓存的使用场景如图2所示 。

文章插图
图片
所以,在秒杀系统中,会对获取秒杀活动列表、获取秒杀活动详情、获取秒杀商品列表和获取秒杀商品详情的接口设计缓存策略 。
推荐阅读
- 10亿数据如何最快插入MySQL?
- TikTok全托管模式是什么?如何解读新模式
- TikTok如何选品?打造爆款不是梦
- 茶叶是酸性还是碱性的?如果茶叶出现酸味,属于正常现象吗?
- 宇宙基本的理论是不含“长度”和“质量”这些概念的吗?
- 老紫砂壶都是单孔的吗
- 引力波是什么东西?对人类有什么影响?
- 社保卡金融功能未激活,养老金领不到,真的是这样吗?
- 运动产生的多巴胺带来的快乐
- 女性荷尔蒙是什么意思
