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

例如:双十一各类促销活动的叠加,整体网站的访问量,商品曝光量会是平时的千倍甚至万倍
如果缓存不能很好的工作
会影响数据库的稳定性,继而直接影响整体服务
那么什么情况会发生缓存穿透呢?
- 不合理的缓存失效策略
导致大量缓存数据在同一时刻发生缓存穿透,业务请求直接打到持久化存储层 - 外部用户的恶意攻击
外部恶意用户利用不存在的 key,来构造大批量不存在的数据请求服务
海量请求全部穿过缓存,落在数据库中,将导致数据库崩溃
缓存穿透如何在业务中避免
- 设置合理的缓存失效策略
- 缓存穿透还可以通过缓存空数据的方式来避免
缓存空数据 —— 针对数据库不存在的数据,在查询为空时,添加一个对应 null 的值到缓存中 -
使用布隆过滤器
例如:Bitmap 是一种特殊的布隆过滤器(自行百度)
20230717204859.jpg
缓存击穿
缓存击穿的具体表现:
前端请求大量的访问某个热点Key,而这个热点 Key 在某个时刻恰好失效,导致请求全部落在数据库上。
缓存击穿失效的数据如果恰好是热点数据,会对系统造成非常大的危险
缓存击穿和缓存穿透都是降低了整体的缓存命中率
缓存击穿可以认为是缓存穿透的一种特殊场景
缓存雪崩
- 大量的缓存数据在同一时刻失效,请求全部转发到数据库,将导致数据库压力过大,服务宕机。
- 缓存服务不稳定,比如负责缓存的 Redis 集群宕机。
因缓存失效时导致的雪崩
- 整体的数据存储链路
- 服务调用链路,最终导致微服务整体的对外服务出现问题
缓存雪崩在业务中如何避免呢?
- 明确缓存集群的容量峰值
-
做好缓存集群的高可用
以 Redis 为例,可以通过部署 RedisCluster ,Proxy 等不同的缓存集群,实现缓存集群高可用
20230719144222.jpg
缓存稳定性
- 缓存应用——防止海量业务请求击垮数据库,保证正常的服务运行
- 考虑缓存的稳定性时,从两个方面展开
- 缓存的数据
- 缓存容器——缓存服务本身的稳定性
- 缓存命中率——落到缓存上的请求占整体请求总量的占比,一般缓存命中要求达到90%以上,大促等场景会要求 99% 以上的命中率
在应用缓存时,要对缓存服务进行压测,明确缓存的最大水位
当前系统容量超过缓存阈值,通过其他的高可用手段进行调整
比如服务限流,请求降级,使用消息队列等
网友评论