Skip to content

缓存穿透是指客户端请求的数据在缓存和数据库中都不存在,这样缓存永远不会生效,这些 请求都会打到数据库。

常见解决方案

  • 缓存空对象

    请求的数据在缓存和数据库中都不存在时,在 Redis 中缓存个空值,这样下次再请求时,就 能使用到缓存了(虽然没有数据),而不会请求数据库。 优点:实现简单,维护方便。 缺点:

    • 额外的内存消耗(设置 TTL 环节)

    • 可能造成短期的不一致(之后正好插入了 id 是原先不存在的 id 的数据,要等 TTL 过期后才能访问到或者插入后覆盖缓存)

  • 布隆过滤

    客户端和 Redis 之间加一个布隆过滤器,在请求进入 Redis 之前先判断是否存在,不存在直接 拒绝请求。

    优点:内存占用较少,没有多余 key。 缺点:

    • 实现复杂

    • 存在误判可能

  • 增强 id 的复杂性,避免被猜测 id 规律。

  • 做好 id 的基础格式校验。

  • 加强用户权限校验

  • 做好热点参数的限流