缓存雪崩
可以简单的理解为: 系统刚刚部署完毕,所有缓存数据还未准备完毕或者由于原有缓存有效期集体到达
例如: 系统中所有缓存都设置的一致的过期时间,在同一时刻出现大面积的缓存过期,所以原本应该查询缓存的请求都去查询数据库了,造成数据库压力骤增,甚至宕机.
解决办法
使用加锁或者队列的方式保证不会有大量线程对数据库进行一次性读写,设置热点数据永不过期,同时将缓存的过期时间设置分散.
设置系统上线后就对需要缓存的数据进行缓存,而不是在第一次查询后才把数据加入缓存,这样做到了事先对缓存数据进行预热.
解决思路
1.写一个刷新缓存的接口,系统上线后手动请求刷新缓存
2.缓存数据量不大时,可以设置项目启动成功后加载缓存数据
3.设置定时刷新缓存
缓存穿透
缓存穿透指用户端查询了一个数据库中不存在的数据,自然在缓存中也不存在.这就导致了用户进行了两次无用查询.
解决办法
推荐的方式是使用Bloom-Filter(布隆过滤器),将所有可能存在的数据存储到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap过滤掉,从而避免了对底层数据库系统的查询压力.
还有一个简单粗暴的方式,如果一个查询返回的数据为空(不管是数据不存在还是系统故障),仍然把这个空结果放入缓存中,设置很短的过期时间(不超过5分钟).通过这个直接设置默认值进缓存的方式,这样第二次查询缓存的时候就有值了,避免去访问底层数据库系统了.