缓存穿透:查询一个根本不存在的数据,缓存和数据库都不会命中,这样每次这类的查询都会透过缓存层查数据库,造成后端数据库压力增大。
如何解决:
1.缓存空对象
查询数据库后没有命中,仍然把空值存到缓存中,并且设置一个较短的时间如300s,这样再次访问就会从缓存层中读取到结果。
2.布隆过滤器
在缓存层之前,把存在的key用布隆过滤器保存起来,做第一层拦截,以保存缓存和存储层。
两种方案的对比,第一种更为常用,适用于数据频繁变化实时性高,而且代码实现容易,但是增了缓存空间。第二种过滤器,适用于相对固定的实时性低的场景,代码实现复杂,缓存空间占用小,各有利弊自己衡量。