上一题下一题

缓存穿透为什么会绕过 Redis 直接冲击数据库,空值缓存和布隆过滤器分别拦截哪一层?

基础版
来源:meituan初级工程师
草稿该题目为草稿状态,前台公开题库中不可见。
答案解析

缓存穿透指查询一个不存在的数据。因为 Redis 中没有对应的缓存,应用会把请求继续发到数据库;数据库查不到后通常也不会产生可缓存的正常结果。攻击者或异常流量反复请求这类数据,就会持续绕过缓存、冲击数据库。

空值缓存是在缓存层拦截:数据库确认数据不存在后,把一个带较短过期时间的空结果写入 Redis。后续相同 key 的请求命中这个空值,就不会再次访问数据库。它适合处理已经发生过的不存在数据查询,但大量不同的随机 key 仍可能占用缓存空间。

布隆过滤器是在请求查 Redis 之前做预判:如果过滤器判断 key 一定不存在,就直接返回,不再查 Redis,也不访问数据库;如果判断可能存在,才继续查 Redis。它能拦截大多数无效 key,但有误判率,可能把不存在的 key 判断为存在,因此不能替代数据库最终校验;同时需要维护过滤器中的数据,并处理数据变更带来的同步问题。

两者拦截的位置不同,可以配合使用:布隆过滤器先挡住大部分确定不存在的请求,空值缓存再吸收过滤器误判或未覆盖的重复查询。

登录后查看完整内容