4.4 混合型缓存设计的优点采用本地缓存+分布式缓存的混合型缓存架构设计方案存在诸多的优点 。其中,本地缓存一个很大的优势就在于不会发生远程IO操作,性能更高,有利于服务的横向伸缩 , 大部分请求会命中本地单机缓存 。这里,我们可以从整体的请求链路上进行分析 。
例如,当前请求链路上需要读取5次分布式缓存中的数据,这样,如果秒杀系统承接了100万的请求,则会产生500万读取分布式缓存的IO操作 。这成倍的IO风险对于秒杀系统来说 , 是绝对不能忽视的风险因素,如图7所示 。

文章插图
图片
可以看到,一次请求会访问5次分布式缓存,这在无形当中就增加了分布式缓存的IO成本,这对秒杀系统来说,是不容忽视的风险项,稍有不慎,则系统可能会由于IO瓶颈引发各种事故,最终造成系统崩溃或者宕机 。所以,在设计秒杀系统时,一定要注意这种放大效应带来的风险 。
因此,在高并发大流量的场景下,很有必要精心的设计本地缓存 。
五、缓存刷新机制数据存放到缓存中,并不是一成不变的,也不会永久存放到缓存中 。也就是说,存放到缓存中的数据终归是要失效或者过期的,也就是存放到缓存中的数据会有相应的生命周期 。
为此需要以一定的策略对缓存中的数据进行刷新操作 , 以防止缓存中的数据长时间过期而导致大部分流量直接打入数据库 。
本节 , 就从本地缓存和分布式缓存两个角度简单聊聊缓存的生命周期 。
5.1 本地缓存刷新机制假设本地缓存基于Guava Cache实现,在设计本地缓存时,本地缓存的容量不宜过大,有效时长不宜过大,并且在设计本地缓存时 , 可以基于版本号机制来实现缓存的失效策略 。
对于本地缓存会实现两种刷新机制:
(1)主动刷新
请求接口传入的版本号如果大于本地缓存中的版本号,说明本地缓存已经失效,此时 , 就需要从分布式缓存中重新获取数据进行刷新 。
(2)被动刷新
本地缓存自动过期,被动从缓存中移除,此时,需要从分布式缓存中重新获取数据进行刷新 。
5.2 分布式缓存刷新机制假设分布式缓存基于Redis实现,对于分布式缓存来说,也需要设置缓存的过期时间 , 不能让缓存数据永久性驻留到Redis中 。相比于本地缓存来说 , 分布式缓存的过期时间要稍微长一些,并且分布式缓存在刷新机制上与本地缓存略有不同 。
(1)主动刷新
业务数据变更驱动刷新分布式缓存数据 。当业务数据发生变更时,会主动刷新分布式缓存中的数据 。
(2)被动刷新
可以基于Redis提供的缓存过期策略,比如基于LRU、TTL等策略淘汰缓存中的数据 。后续在访问分布式缓存中的数据时,如果检测到分布式缓存中的数据已经过期,则会使用一个线程来刷新分布式缓存中的数据 。
六、数据一致性可以这么说,只要系统中使用了缓存 , 就或多或少会涉及到数据一致性的问题,在秒杀系统中,数据一致性的问题主要包括:本地缓存与分布式缓存数据一致性问题 , 缓存与数据库数据一致性问题 。同时,在数据一致性保证方面,就包括强一致性保证和弱一致性保证 。
6.1 强一致性保证CAP理论为数据的强一致性奠定了理论基础 , 但是CAP理论下的数据强一致性 , 很难做到既保证系统高性能的同时 , 又要保证数据的绝对一致 。在秒杀系统的设计中,我们会将数据的强一致性保证交给数据库和业务规则来实现,在业务规则层面结合数据库来实现强一致 。
例如,假设用户在抢购秒杀商品中,缓存中存在商品库存,通过了缓存中的校验逻辑 。在真正下单时,还要校验数据库中的商品库存,如果此时数据库中已经没有商品剩余库存了 , 则终止下单逻辑,提示用户商品已售罄 。
6.2 弱一致性保证强一致性保证交由业务规则和数据库共同约束实现,缓存层面的数据就可以实现为弱一致性 。
也就是说,在很小的一段时间内,允许缓存中的数据存在延迟,允许缓存中的数据与数据库中的数据在短时间内的不一致,只要在可接受的时间范围内最终达到一致即可 。
充分发挥缓存的实际作用,即:缓存数据,提供系统的读写性能和抗系统流量 。
七、缓存落地实现在秒杀系统中本地缓存和分布式缓存相结合,能够抗住进入秒杀系统内部的大部分流量 。并且在技术选型上 , 假设本地缓存默认基于Guava Cache实现,分布式缓存默认基于Redis实现 。
推荐阅读
- 10亿数据如何最快插入MySQL?
- TikTok全托管模式是什么?如何解读新模式
- TikTok如何选品?打造爆款不是梦
- 茶叶是酸性还是碱性的?如果茶叶出现酸味,属于正常现象吗?
- 宇宙基本的理论是不含“长度”和“质量”这些概念的吗?
- 老紫砂壶都是单孔的吗
- 引力波是什么东西?对人类有什么影响?
- 社保卡金融功能未激活,养老金领不到,真的是这样吗?
- 运动产生的多巴胺带来的快乐
- 女性荷尔蒙是什么意思
