Redis - 缓存穿透

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

例如,某位黑客故意制造了大量无效的 id 发往服务端,使得大量请求落到数据库上,数据库也没有查到对应的数据,此操作对于数据库造成了大量的压力。

主要有如下方法解决:

  1. 数据格式校验
  2. 缓存空对象
  3. 布隆过滤
  4. 接口限流

数据格式校验

例如,对于 ID,检验是否为正整数;对于邮箱、手机号等数据,做好校验。

缓存空对象

如果数据库访问到空值,将该空值也存到 redis 里。

优点:实现简单,维护方便

缺点: - 额外内存消耗(加入较短的 TTL 缓解) - 可能造成短期的不一致(TTL 缓解,或主动失效缓存)

布隆过滤

优点:内存占用少,没有多余的 key

缺点:

  • 实现复杂
  • 存在误判可能

接口限流

对用户或者 IP 进行限流,对于恶意用户,可以采取黑名单的方式禁止访问接口。