美文网首页
34. 如何避免 缓存穿透,缓存击穿,缓存雪崩

34. 如何避免 缓存穿透,缓存击穿,缓存雪崩

作者: 木叶苍蓝 | 来源:发表于2023-07-18 14:48 被阅读0次
20230717203943.jpg

缓存穿透

业务请求穿透缓存层直接打到数据库存储层,导致数据库出现风险。


20230717204054.jpg

例如:双十一各类促销活动的叠加,整体网站的访问量,商品曝光量会是平时的千倍甚至万倍
如果缓存不能很好的工作
会影响数据库的稳定性,继而直接影响整体服务

那么什么情况会发生缓存穿透呢?
  • 不合理的缓存失效策略
    导致大量缓存数据在同一时刻发生缓存穿透,业务请求直接打到持久化存储层
  • 外部用户的恶意攻击
    外部恶意用户利用不存在的 key,来构造大批量不存在的数据请求服务
    海量请求全部穿过缓存,落在数据库中,将导致数据库崩溃
缓存穿透如何在业务中避免
  1. 设置合理的缓存失效策略
  2. 缓存穿透还可以通过缓存空数据的方式来避免
    缓存空数据 —— 针对数据库不存在的数据,在查询为空时,添加一个对应 null 的值到缓存中
  3. 使用布隆过滤器
    例如:Bitmap 是一种特殊的布隆过滤器(自行百度)


    20230717204859.jpg

缓存击穿

缓存击穿的具体表现:
前端请求大量的访问某个热点Key,而这个热点 Key 在某个时刻恰好失效,导致请求全部落在数据库上。
缓存击穿失效的数据如果恰好是热点数据,会对系统造成非常大的危险
缓存击穿和缓存穿透都是降低了整体的缓存命中率
缓存击穿可以认为是缓存穿透的一种特殊场景

缓存雪崩

  • 大量的缓存数据在同一时刻失效,请求全部转发到数据库,将导致数据库压力过大,服务宕机。
  • 缓存服务不稳定,比如负责缓存的 Redis 集群宕机。

因缓存失效时导致的雪崩

  • 整体的数据存储链路
  • 服务调用链路,最终导致微服务整体的对外服务出现问题
缓存雪崩在业务中如何避免呢?
  • 明确缓存集群的容量峰值
  • 做好缓存集群的高可用
    以 Redis 为例,可以通过部署 RedisCluster ,Proxy 等不同的缓存集群,实现缓存集群高可用


    20230719144222.jpg
缓存稳定性
  • 缓存应用——防止海量业务请求击垮数据库,保证正常的服务运行
  • 考虑缓存的稳定性时,从两个方面展开
    1. 缓存的数据
    2. 缓存容器——缓存服务本身的稳定性
  • 缓存命中率——落到缓存上的请求占整体请求总量的占比,一般缓存命中要求达到90%以上,大促等场景会要求 99% 以上的命中率

在应用缓存时,要对缓存服务进行压测,明确缓存的最大水位
当前系统容量超过缓存阈值,通过其他的高可用手段进行调整
比如服务限流,请求降级,使用消息队列等

相关文章

网友评论

      本文标题:34. 如何避免 缓存穿透,缓存击穿,缓存雪崩

      本文链接:https://www.haomeiwen.com/subject/xwywudtx.html