Redis 缓存穿透、击穿、雪崩 的区别与解决方案

前言

Redis 是一个高性能的键值数据库,广泛应用于缓存、会话存储、实时数据分析等场景。然而,在高并发的环境下,Redis 缓存可能会遇到 缓存击穿缓存穿透缓存雪崩 这三大问题。这些问题不仅影响系统的稳定性和性能,还经常出现在面试题中,值得我们深入了解🤏。


1. 缓存穿透

定义

缓存穿透指的是查询一个不存在的数据时,缓存层和数据库层都会返回空结果,导致每次请求都直接访问数据库,从而失去缓存的加速作用,增加数据库的负担。

"穿透 "可以简单的理解为:缓存和数据库都不存在要查询的数据,请求直接"穿透"了缓存。

场景

例如:用户请求一个不存在的商品ID,由于缓存和数据库中都没有该商品的信息,请求直接穿透到数据库,增加数据库的压力。

解决方案

  1. 布隆过滤器

    使用布隆过滤器缓存不存在的请求,避免每次都查询数据库。布隆过滤器可以高效判断某个元素是否在集合中,减少不必要的数据库查询。

  2. 缓存空值

    当查询结果为空时,可以将空值缓存一段时间(如 1-5 分钟),避免频繁穿透。这样即使请求再次到来,也能从缓存中返回空值,减少数据库查询。

流程图

用户请求不存在的数据 检查缓存 缓存未命中 检查数据库 返回空结果 缓存空值 减少数据库负载


2. 缓存击穿

定义

缓存击穿是指缓存中的某些数据在失效后,大量请求同时访问该数据,导致所有请求直接穿透到数据库,增加数据库压力,甚至可能导致数据库崩溃。

"击穿 "可以简单的理解为:缓存不存在,但是数据库存在要查询的数据,请求直接"击穿"了缓存。

场景

例如:某个商品详情数据在缓存中过期,多个用户同时请求该商品数据,由于缓存失效,这些请求直接访问数据库,造成数据库负载骤增。

解决方案

  1. 互斥锁

    在缓存失效时,使用分布式锁确保只有一个请求访问数据库并更新缓存,其余请求等待缓存更新完毕后再从缓存中获取数据,避免同时访问数据库。

  2. 缓存预热

    在系统启动时,提前将常用数据加载到缓存中,减少缓存失效的概率,确保热点数据一直在缓存中。

  3. 合理的缓存失效时间

    根据数据访问频率和业务需求合理设定缓存过期时间,避免过短的失效时间引起频繁的缓存更新和数据库访问。

流程图

用户请求数据 检查缓存 缓存失效 检查数据库 返回数据 更新缓存 后续请求直接访问缓存


3. 缓存雪崩

定义

缓存雪崩是指大量缓存数据在同一时间失效,导致大量请求同时访问数据库,给数据库带来巨大压力,甚至可能导致数据库崩溃。

"雪崩 "可以简单的理解为:大量缓存同一时间失效,缓存"雪崩"了。

场景

例如:大量缓存数据设置了相同的过期时间,所有缓存数据在某一时刻失效,导致大量请求同时访问数据库,可能引发雪崩效应。

解决方案

  1. 错开缓存过期时间

    在缓存过期时间上增加随机偏移量,错开过期时间,减少缓存同时过期的情况。

  2. 使用永久缓存

    对于不经常变化的数据,可以使用永久缓存,避免频繁失效,减少数据库访问。

  3. 降级处理

    当缓存系统发生故障时,启用降级机制,将部分请求转发至备用缓存或返回默认值,减轻数据库压力。

流程图

多个缓存项过期 多个用户请求同时访问数据库 访问数据库 数据库返回数据 更新缓存 后续请求直接访问缓存


总结

  • 缓存穿透:查询数据时 缓存和数据库都不存 ,使用 布隆过滤器缓存空值 避免每次都访问数据库。
  • 缓存击穿:查询数据时 缓存不存在,数据库存在 ,使用 互斥锁缓存预热合理的过期时间 解决。
  • 缓存雪崩:查询数据时 大量缓存同一时间失效 ,通过 错开缓存过期时间使用永久缓存降级处理 应对。
相关推荐
大大菜鸟一枚9 分钟前
arm使用ubi系统
linux·arm开发·学习
Catherinemin19 分钟前
剑指Offer|LCR 031. LRU 缓存
javascript·算法·缓存
然然阿然然28 分钟前
2025.1.15——六、SQL结构【❤sqlmap❤】
数据库·sql·学习·安全·web安全·网络安全
学海无涯乐作舟1 小时前
Harmony面试模版
面试·职场和发展
leegong231112 小时前
华为EulerOS 学习,是否要先 RHCE?
学习·华为
im长街3 小时前
4.Proto 3 语法详解
开发语言·学习
Test_the_rookie4 小时前
mongDB学习笔记
笔记·学习
Mae_cpski4 小时前
【React学习笔记】第一章:React入门
笔记·学习·react.js
wangqiaowq5 小时前
从AI原理到模型演进及代码实践 的学习一
学习
许白掰6 小时前
C语言学习——指针与数组,指针与函数,指针与堆空间
c语言·学习·算法