缓存穿透和缓存雪崩

来源:互联网 发布:香港淘宝怎么注册 编辑:程序博客网 时间:2024/05/22 01:35

一:缓存穿透:查找一个 必然不存在的数据,首先通过key到缓存去查找,不存在,然后到达DB,这样会对后台的DB造成很大的压力,这样每次都会请求到达数据库,这就是缓存穿透
缓存失效:如果缓存集中在一段时间内失效,DB的压力凸显
缓存穿透避免的方法:
1:最简单粗暴的方法:如果在数据库中查找的也为null,直接在缓存中设置默认值,设置较短的额过期时间,这样第二次到缓存中屈查找的时候就会查到;
2:根据缓存数据Key的规则,在做缓存规划的时候,Key有一定规则的话,可以采取这种办法。这种办法只能缓解一部分的压力,过滤和系统无关的查询,但是无法根治。
3:采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的BitSet中,不存在的数据将会被拦截掉,从而避免了对底层存储系统的查询压力。
大并发的缓存穿透会导致缓存雪崩
二:缓存雪崩的情况:当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。
以下原因都会造成缓存集体失效,从而引发系统抖动,甚至雪崩:
1:系统预热数据的缓存过期时间过于整齐划一
2:缓存系统宕机或重启
3:访问高峰期间产生啦大量的缓存,过期时间非常接近
解决思路:
1,采用加锁计数,或者使用合理的队列数量来避免缓存失效时对数据库造成太大的压力。这种办法虽然能缓解数据库的压力,但是同时又降低了系统的吞吐量。

2,分析用户行为,尽量让失效时间点均匀分布。避免缓存雪崩的出现。

3,如果是因为某台缓存服务器宕机,可以考虑做主备,比如:redis主备,但是双缓存涉及到更新事务的问题,update可能读到脏数据,需要好好解决。
分布式缓存系统
分布式缓存系统面临的问题
缓存一致性问题
1:缓存系统与底层数据的一致性。这点在底层系统是“可读可写”时,写得尤为重要

2:有继承关系的缓存之间的一致性。为了尽量提高缓存命中率,缓存也是分层:全局缓存,二级缓存。他们是存在继承关系的。全局缓存可以有二级缓存来组成。

3:多个缓存副本之间的一致性。为了保证系统的高可用性,缓存系统背后往往会接两套存储系统(如memcache,redis等)