Redis是大型架构核心,下面我详解Redis缓存穿透@mikechen
Redis缓存穿透方案:布隆过滤器
Redis 常被用作缓存层以减轻后端数据库压力。
然而,缓存穿透问题会导致大量不存在的请求直接落到后端数据库,造成资源浪费甚至服务不可用。

在访问 Redis 前,先用 布隆过滤器判断 key 是否可能存在。
如果布隆过滤器判定“绝对不存在”,则直接拒绝请求,不访问数据库。
if (bloomFilter.exists(key)) → 再查Redis else → 直接返回空
优点:高效拦截无效请求,减少数据库压力,占用内存极小。
缺点:存在误判率(会有极少数不存在的key被认为存在)。
以及,需要维护过滤器的更新机制。
Redis缓存穿透方案:缓存空值
当数据库返回空结果时,也在 Redis 中缓存一个“空值”,
下次再查询同样的 key 时,直接返回空缓存结果,不再访问数据库。

优点
简单高效,阻断重复请求。
缺点
若恶意请求量巨大,仍会造成 Redis 存储压力。
需设置短期过期时间,避免占用太多空间。
Redis缓存穿透方案:接口限流与防刷
通过限流、黑名单、验证码等方式,减少恶意穿透请求。

使用 Nginx + Lua 或 网关层限流(如 Sentinel、Gateway)。
对异常频率IP封禁或加入黑名单。
对高风险接口添加验证机制(如 token 或验证码)。
Redis缓存穿透方案:认证与业务校验
很多穿透请求本身参数就非法,(如 userId = -1、商品ID = 0),
可以在业务层进行参数合法性校验,直接拦截。

if (userId <= 0) {
return null; // 不查询缓存,不查数据库
}
优点:
从源头阻断异常请求。
无额外系统开销。
缺点:
仅能拦截明显无效参数,无法防止随机攻击。