如何解决Redis缓存穿透(4大解决方案)

Redis是大型架构核心,下面我详解Redis缓存穿透@mikechen

Redis缓存穿透方案:布隆过滤器

Redis 常被用作缓存层以减轻后端数据库压力。

然而,缓存穿透问题会导致大量不存在的请求直接落到后端数据库,造成资源浪费甚至服务不可用。

如何解决Redis缓存穿透(4大解决方案)

在访问 Redis 前,先用 布隆过滤器判断 key 是否可能存在。

如果布隆过滤器判定“绝对不存在”,则直接拒绝请求,不访问数据库。

if (bloomFilter.exists(key)) → 再查Redis
else → 直接返回空

优点:高效拦截无效请求,减少数据库压力,占用内存极小。

缺点:存在误判率(会有极少数不存在的key被认为存在)。

以及,需要维护过滤器的更新机制。

 

Redis缓存穿透方案:缓存空值

当数据库返回空结果时,也在 Redis 中缓存一个“空值”,

下次再查询同样的 key 时,直接返回空缓存结果,不再访问数据库。

如何解决Redis缓存穿透(4大解决方案)

优点

简单高效,阻断重复请求。

缺点

若恶意请求量巨大,仍会造成 Redis 存储压力。

需设置短期过期时间,避免占用太多空间。

 

Redis缓存穿透方案:接口限流与防刷

通过限流、黑名单、验证码等方式,减少恶意穿透请求。

如何解决Redis缓存穿透(4大解决方案)

使用 Nginx + Lua 或 网关层限流(如 Sentinel、Gateway)。

对异常频率IP封禁或加入黑名单。

对高风险接口添加验证机制(如 token 或验证码)。

 

Redis缓存穿透方案:认证与业务校验

很多穿透请求本身参数就非法,(如 userId = -1、商品ID = 0),

可以在业务层进行参数合法性校验,直接拦截。

如何解决Redis缓存穿透(4大解决方案)

if (userId <= 0) {
    return null; // 不查询缓存,不查数据库
}

优点:

从源头阻断异常请求。

无额外系统开销。

缺点:

仅能拦截明显无效参数,无法防止随机攻击。

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧