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

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

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

布隆过滤器是解决缓存穿透最权威、最高效的方法,尤其适用于数据量巨大的场景。

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

布隆过滤器是一个 空间效率极高 的概率型数据结构。

它将所有 可能存在 的 Key ,预先存储在一个巨大的位图(Bit Array)中。

当一个请求到来时,先通过布隆过滤器进行判断:

如果判断 Key 不存在: 直接返回,请求不会进入缓存或数据库。

如果判断 Key 可能存在: 才允许请求继续访问 Redis 和数据库。

优势: 极大地节省内存空间;

不足: 存在 误判率(False Positive)。

即布隆过滤器可能判断 Key 存在,但实际上它不存在(概率很低)。

 

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

当应用层查询数据库发现某个 Key 不存在时,不要直接返回空。

而是将一个 特殊的空值(如一个特定的字符串、null 或一个默认对象) 写入 Redis 缓存。

考虑到空值数据量大,且未来真实数据可能会被写入,空值的缓存时间应设置得 较短(例如 5 到 10 分钟)。

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

优势: 实现简单,立竿见影,能有效拦截对同一个不存在 Key 的高并发请求。

不足: 占用了 Redis 的内存空间来存储大量无意义的空 Key。

需要设置过期时间,否则可能造成新数据写入后,用户仍然查询到缓存中的空值。

 

Redis缓存穿透方案:预热缓存

该方法,主要针对非恶意的首次穿透请求(例如业务启动初期)。

比如:在系统上线、流量高峰期来临之前。

对热点数据进行更新后,主动将可能被高频访问的数据, 提前加载 到 Redis 缓存中。

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

优势: 保证系统在高峰期以最佳状态运行,极大地提高了缓存命中率。

不足: 无法防御恶意的、随机的 Key 攻击。

 

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

对于恶意攻击,系统需要设置熔断和限流机制作为最后一道防线。

比如:在 API 接口网关层或业务逻辑层,对请求的参数进行合法性校验,并限制请求频率。

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

对于像用户 ID、商品 ID 等参数,校验其格式、长度和取值范围。

如果参数明显不合法,直接在业务层拦截。

使用 Nginx、Sentinel 或 Guava RateLimiter 等工具,限制同一用户 ID 或同一 IP 在单位时间内的访问次数。

一旦超过阈值,则直接返回错误码或熔断。

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

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