CharLemAznable / blog

When I was young, I used to think that money was the most important thing in life, now that I am old, I know it is.
MIT License
4 stars 0 forks source link

缓存风险 #26

Open CharLemAznable opened 1 year ago

CharLemAznable commented 1 year ago

缓存不是多多益善,它属于有利有弊,是真正到必须使用时才考虑的解决方案。

缓存穿透

如果查询的数据在数据源中根本不存在的话,缓存里自然也不会有,这类请求的流量每次都不会命中,每次都会触及到末端的数据源,缓存就起不到缓解压力的作用了,这种查询不存在数据的现象被称为缓存穿透。

为了解决缓存穿透,通常会采取下面两种办法:

缓存击穿

如果缓存中某些热点数据忽然因某种原因失效了,譬如典型地由于超期而失效,此时又有多个针对该数据的请求同时发送过来,这些请求将全部未能命中缓存,都到达真实数据源中去,导致其压力剧增,这种现象被称为缓存击穿。

要避免缓存击穿问题,通常会采取下面的两种办法:

缓存雪崩

不是针对单个热点数据的大量请求,而是由于大批不同的数据在短时间内一起失效,导致了这些数据的请求都击穿了缓存到达数据源,同样令数据源在短时间内压力剧增。

要避免缓存雪崩问题,通常会采取下面的三种办法:

缓存污染

缓存污染是指缓存中的数据与真实数据源中的数据不一致的现象,即缓存和数据源间无法保证最终的一致性。

为了尽可能的提高使用缓存时的一致性,已经总结不少更新缓存可以遵循设计模式,譬如 Cache Aside、Read/Write Through、Write Behind Caching 等。其中最简单、成本最低的 Cache Aside 模式是指:

其中在写入缓存时,有必要专门强调两点:

Cache Aside 模式也会出现缓存中回填的内容与数据源的实际数据不一致的情况。但这种情况的概率是很低的,所以其仍然是以低成本更新缓存,并且获得相对可靠结果的解决方案。

——《凤凰架构:构建可靠的大型分布式系统》 > 架构师的视角 > 透明多级分流系统 > 服务端缓存 > 缓存风险