Redis - 缓存穿透
缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。最终造成服务宕机。
例如,某位黑客故意制造了大量无效的 id 发往服务端,使得大量请求落到数据库上,数据库也没有查到对应的数据,此操作对于数据库造成了大量的压力。
主要有如下方法解决:
- 数据格式校验
- 缓存空对象
- 布隆过滤
- 接口限流
数据格式校验
例如,对于 ID,检验是否为正整数;对于邮箱、手机号等数据,做好校验。
缓存空对象
如果数据库访问到空值,将该空值也存到 redis 里。
优点:实现简单,维护方便
缺点: - 额外内存消耗(加入较短的 TTL 缓解) - 可能造成短期的不一致(TTL 缓解,或主动失效缓存)
布隆过滤
优点:内存占用少,没有多余的 key
缺点:
- 实现复杂
- 存在误判可能
接口限流
对用户或者 IP 进行限流,对于恶意用户,可以采取黑名单的方式禁止访问接口。