面试题答案
一键面试缓存穿透产生的原因
- 恶意请求:攻击者故意构造不存在的 key 频繁请求,由于缓存中没有,每次都会去查询数据库,而数据库也无对应记录,导致大量请求穿透缓存直达数据库。
- 数据异常:业务系统中某些数据在特定情况下未正常写入缓存,或者缓存数据过期后没有及时重新加载,而此时恰好有请求访问这些数据,就会造成缓存穿透。
解决方案及原理
- 布隆过滤器
- 原理:在缓存之前使用布隆过滤器,布隆过滤器是一种概率型数据结构,它可以高效地判断一个元素是否存在于集合中。当一个请求到达时,先经过布隆过滤器判断 key 是否可能存在。如果布隆过滤器判断 key 不存在,那么可以直接返回,不再查询数据库,从而避免无效请求穿透到数据库。这样能大幅减少对数据库的无效访问,使真正有效的请求更多地命中缓存,提升缓存命中率。因为如果布隆过滤器拦截了大量无效请求,数据库压力降低,缓存加载数据更稳定,后续请求命中缓存的概率就提高了。
- 空值缓存
- 原理:当查询数据库发现数据不存在时,也将这个 key 对应的空值存入缓存,并设置一个较短的过期时间。这样下次相同的请求过来时,缓存中就有这个 key 的记录(虽然是表示不存在的空值),就不会再去查询数据库,直接返回空值。减少了对数据库的无效查询,保证了缓存对请求的正常响应,提升了缓存命中率。因为每次请求都能在缓存中得到响应,不会因为数据库无记录而频繁绕过缓存。