1、缓存穿透
查询一个数据库中一定不存在的数据,例如传入的参数为-1,虽然它不存在,但是还是回去数据库中去查,每次查询的结果都为空并且又不进行缓存。利用这个漏洞,会对数据库造成压力。
解决方式1:缓存空对象(成本低)
对查询结果为空的对象也进行缓存,如果是集合,可以缓存一个空的集合(非null),如果是缓存单个对象,可以通过字段标识来区分。这样避免请求穿透到后端数据库。
解决方式2:单独过滤处理(成本高)
以进行单独过滤处理对所有可能对应数据为空的key进行统一的存放,并在请求前做拦截,这样避免请求穿透到后端数据库。这种方式实现起来相对复杂。
2、 缓存雪崩
主要是指在某一个时间段,缓存的集体失效时间同时发生,在这中情况下并发请求就会集体访问数据库,对于数据库来说,这个高并发无疑会给数据库来了巨大压力,产生周期性的压力波峰。
解决方式1 :尽可能的分散缓存的过期时间,特别是那些热点数据,最好设定的过期时间长一点,冷门的数据设置过期时间长一点。
解决方式2 : 尽量在设置缓存过期时间的时候在其后面加一个随机因子,例如以时间戳为节点,这样过期时间就不会同时发生了。
3、 缓存击穿
主要是指缓存中的某个key非常的热门,高并发时候一直被不停的访问,同时当这个key失效的时候,持续的高并发就会击穿缓存,直接访问数据库,给数据库造成巨大压力。
解决方式 1 :对那些主打的热点数据,设置永久不会过期,这样避免了访问数据库的访问。
解决方式 2 :使用互斥锁(mutex key),主要是使用mutex。简单地来说,就是在缓存失效的时候判断值是否为空,不是立即去访问数据库,先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutex key,当操作返回成功时,再进行访问数据库并回设缓存;否则,就重试整个get缓存的方法。
缓存穿透、缓存雪崩、缓存击穿----简略理解与解决方式
最新推荐文章于 2022-02-12 17:56:11 发布