参考文章:https://blog.csdn.net/zeb_perfect/article/details/54135506
一、缓存穿透
重点在透,透过缓存,直接读取数据库。什么场景下会出现这种情况呢?
查询不存在的值,是可能出现穿透的。
这种情况大概率是攻击者
解决方案:
1、缓存空值,但是一定要设置过期时间,且过期时间要短一些。
2、布隆过滤器。构造全量数据的布隆过滤器,对于不存在的key,有可能查询出来为1。但是查询出来不为1的key,是一定不存在的,可以直接过滤,无需查询DB。
二、缓存击穿
重点在“击”和“穿”,现象也是流量都打到DB上了。但是,它并不是查询不存在的值引起的。而是由于某个key恰好失效了,这个时候恰好高并发请求过来。这种情况一般出现在热点key上,用户又恰好同时访问这个热点key。导致,并发请求都打到DB上。
解决方案:
1、热点key,最好不要设置过期时间。由后台线程异步定时刷新,可能实时性差一点,但是性能好。
2、过期后,去数据拿数据的时候做一下控制。用分布式锁控制下去DB拿相同key的请求,这种解决方案只适用击穿,就是只能是同一个key,才能控制并发。
三、缓存雪崩
重点在雪崩,意思是大量不同key,都打到DB上。一般出现在大量key,在同一时间点过期,导致请求这些key同时打到DB上。
这个时候,就不能像上面采用锁在控制并发了。因为请求的是不同key,锁不住。
解决方案:
1、key的过期时间,不要在同一个时间,尽量随机。
2、请求排队,相当于削峰。缺点是实时性受影响。
网友评论