什么是缓存击穿、缓存穿透、缓存雪崩?

2 个回答

  • 陆雪琪
    我一路种下蘑菇,只为让你知道回家的路。
    ![image.png](https://images.codewd.com/9d8a2de96080ab1e1fa8ee88f06cf8d4.jpg "image.png") ## 缓存击穿 ### 原因 指某些热点key到达了过期的那个时间点,这个时候刚好有大量的并发请求需要查询这个key,从而导致并发请求直接打到了数据库,这就是缓存击穿。 ### 解决方案 - 提前将热门数据放入redis缓存 - 对热门key进行监控,定期进行续期 - 对不同级别的key设置不同的缓存时间 - 设置分布式锁 ![image.png](https://images.codewd.com/3fed00ba3d14bb7719e468b602ba036c.jpg "image.png") ## 缓存穿透 ### 原因 这个是恶意攻击导致的,黑客通过伪造非法的id,查询数据库中不存在的key,导致经过redis缓存时:判断key不存在,则直接查DB,最终导致所有请求全部达到了DB中,造成缓存穿透 ### 解决方案 - 缓存一个特定的值,代表数据库中不存在,如 空值 - 使用Redis布隆过滤器:如果不存在那就一定不存在,如果存在但是不一定存在 - 设置有规律的id,如果不满足规则条件则拦截 ![image.png](https://images.codewd.com/faee4a289400984d19e1b628600e85e9.jpg "image.png") ## 缓存雪崩 ### 原因1: 大量key同时过期,导致所有请求全部打到DB中 ### 解决方案1 - 缓存时间最好不要设置一样,可以上下波动一个阈值 - 服务降级 ### 原因2 缓存中间件直接宕机 ### 解决方案2 - 限流 - 熔断 - 建立高可用缓存集群
    发布于 2025-03-18 05:40 •IP属地 江西
    举报
    评论
    收藏

  • 韩雪
    想多了全是问题,想开了全是答案。
    ### 1. **缓存击穿 (Cache Breakdown)** **定义**:当缓存中某个 **key** 的数据过期时,多个并发请求同时到达缓存,导致这些请求都绕过缓存直接访问数据库,造成数据库瞬间承受大量并发请求,导致 **数据库负载过高**。 **场景**:例如,某个热门商品的缓存过期了,多个用户在同一时间请求这个商品的数据,缓存未命中,所有请求都直接访问数据库,导致数据库瞬间被大量并发请求压垮。 **解决方案**: - **加锁**:在缓存过期时,只有第一个请求去查询数据库并重新加载缓存,其他请求等待缓存重新加载完毕。 - **设置合理的过期时间**:避免大并发请求在短时间内频繁访问数据库。 ### 2. **缓存穿透 (Cache Penetration)** **定义**:当请求的 **key** 在缓存中找不到,并且数据库中也没有对应的数据,导致每次请求都绕过缓存访问数据库,造成缓存完全没有起到作用,所有请求都直接打到数据库上。 **场景**:例如,用户请求某个不存在的商品信息,缓存没有此数据,数据库中也没有该商品的记录,最终每次请求都绕过缓存直接访问数据库,造成数据库不必要的压力。 **解决方案**: - **缓存空数据**:对于查询不到的数据,可以将结果(如空值、默认值)也缓存起来,防止每次都查询数据库。 - **使用布隆过滤器**:通过布隆过滤器快速判断某个数据是否存在,从而避免不必要的数据库查询。 ### 3. **缓存雪崩 (Cache Avalanche)** **定义**:当大量缓存的 **key** 同时过期或缓存服务宕机,导致大量请求都直接访问数据库,造成数据库负载激增,甚至可能引发数据库宕机。 **场景**:例如,缓存中大量的热点数据(如每天零点过期的缓存数据)同时失效,导致大量请求同时打到数据库,造成数据库瞬间压力过大。 **解决方案**: - **缓存过期时间分散**:避免所有缓存都在同一时间过期,可以通过设置不同的过期时间,防止缓存同时失效。 - **双重缓存机制**:在缓存失效时,采用第二级缓存来缓解压力,或者延迟数据库访问的时间。 - **持久化缓存**:使用 Redis 等缓存服务的持久化功能,确保即使缓存服务重启,也能避免数据丢失。 - **降级策略**:当缓存系统不可用时,可以通过降级策略(如返回静态页面或默认值)来减少对数据库的访问。 ### 总结记忆方法: - **缓存雪崩**:想象成雪崩是多个 key 同时过期,"没有一个 key 是无辜的"。很多缓存同时失效,导致数据库过载。 - **缓存穿透**:就像是“透”过了缓存和数据库,没有数据可以访问,所有请求都直接打到数据库上。 - **缓存击穿**:某个 key 过期时,大量请求同时访问,击穿缓存,造成数据库负载过大。
    发布于 2025-02-18 11:33 •IP属地 湖南
    举报
    评论
    收藏1