产生缓存穿透的原因可能是外部的恶意攻击。例如,对用户信息进行了缓存,但恶意攻击者使用不存在的用户 ID 频繁请求接口,导致查询缓存不命中,然后穿透 DB 查询仍然不命中,这时会有大量请求穿透缓存访问 DB。缓存穿透示意如图Q60-1所示。
缓存穿透的避免办法如下。
(1)对不存在的 Key,在缓存中保存一个空对象进行标记,防止相同 ID 再次访问 DB。不过有时候这种方法并不能很好地解决问题,可能导致缓存中存储大量无用数据。
(2)使用 BloomFilter。BloomFilter 的特点是存在性检测,其非常适合解决缓存穿透问题。如果BloomFilter中不存在,那么数据一定不存在,过滤100%准确;但是,BloomFilter对存在数据的过滤有一定的误报率。
图Q60-1 缓存穿透示意