Redis是大型架构核心,下面我详解Redis缓存穿透@mikechen
Redis缓存穿透方案:布隆过滤器
布隆过滤器是解决缓存穿透最权威、最高效的方法,尤其适用于数据量巨大的场景。

布隆过滤器是一个 空间效率极高 的概率型数据结构。
它将所有 可能存在 的 Key ,预先存储在一个巨大的位图(Bit Array)中。
当一个请求到来时,先通过布隆过滤器进行判断:
如果判断 Key 不存在: 直接返回,请求不会进入缓存或数据库。
如果判断 Key 可能存在: 才允许请求继续访问 Redis 和数据库。
优势: 极大地节省内存空间;
不足: 存在 误判率(False Positive)。
即布隆过滤器可能判断 Key 存在,但实际上它不存在(概率很低)。
Redis缓存穿透方案:缓存空值
当应用层查询数据库发现某个 Key 不存在时,不要直接返回空。
而是将一个 特殊的空值(如一个特定的字符串、null 或一个默认对象) 写入 Redis 缓存。
考虑到空值数据量大,且未来真实数据可能会被写入,空值的缓存时间应设置得 较短(例如 5 到 10 分钟)。

优势: 实现简单,立竿见影,能有效拦截对同一个不存在 Key 的高并发请求。
不足: 占用了 Redis 的内存空间来存储大量无意义的空 Key。
需要设置过期时间,否则可能造成新数据写入后,用户仍然查询到缓存中的空值。
Redis缓存穿透方案:预热缓存
该方法,主要针对非恶意的首次穿透请求(例如业务启动初期)。
比如:在系统上线、流量高峰期来临之前。
对热点数据进行更新后,主动将可能被高频访问的数据, 提前加载 到 Redis 缓存中。

优势: 保证系统在高峰期以最佳状态运行,极大地提高了缓存命中率。
不足: 无法防御恶意的、随机的 Key 攻击。
Redis缓存穿透方案:认证与业务校验
对于恶意攻击,系统需要设置熔断和限流机制作为最后一道防线。
比如:在 API 接口网关层或业务逻辑层,对请求的参数进行合法性校验,并限制请求频率。

对于像用户 ID、商品 ID 等参数,校验其格式、长度和取值范围。
如果参数明显不合法,直接在业务层拦截。
使用 Nginx、Sentinel 或 Guava RateLimiter 等工具,限制同一用户 ID 或同一 IP 在单位时间内的访问次数。
一旦超过阈值,则直接返回错误码或熔断。
作者简介
陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注作者「mikechen」公众号,获取更多技术干货!
后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》