缓存穿透

一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。如果key对应的value是一定不存在的,并且对该key并发请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。总结为一句话:去查找的key在DB中不存在,每次都要去DB中查,给DB带来巨大的压力,这就是缓存穿透。

如何避免 : 

1.对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。

问题一:
空值做了缓存,这样就无形了增加了很多没有意义的缓存,内存吃紧。比较有效的方式就是在这些值上面设置一个过期时间,让起自动删除,一般设置不超过5分钟
问题二:
有可能与业务存在不一致的窗口时间,如:虽然商品ID=10000现在不存在,我们现在在redis中保存了一个空值,但业务后来就真的有了商品id为10000的数据,这样数据库和缓存的信息就不一致,导致业务出现问题。此时就可以利用消息中间件等方式系统剔除掉此缓存数据

2:采用布隆过滤器,对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。

缓存预热(热备份)

当数据量级不大时,可以先开启数据库,当客户端访问的数据不在缓存中,就从数据库中将数据取出并存入缓存,这是可以的。但是,当数据量非常大时,但是初始时缓存中没有内容,假设启动服务器程序后,客户端发来大量的请求,由于缓存中没有内容,大量的请求将会导致服务器查询数据库,使得数据库被击垮。 因此,在程序开始之前,先将数据库中的一部分数据(一般指经常访问的数据、访问频率高的热数据)先存到缓存中,然后再开启程序进行服务。这就是缓存预热(热备份)。