缓存击穿、缓存穿透、缓存雪崩的定义和解决方案

笔者这段时间复习了一下缓存异常的几个概念和解决办法,在这里记录一下


一、缓存击穿

1、概念

击穿其实就是某个高访问量的缓存数据,它的缓存过期时间到了,这个时候仍旧有大量对这个数据的请求发送过来,当这些请求发现缓存中没有对应数据的时候就直接去访问数据库了,这一瞬间可能就会对数据库造成巨大的压力,可能会把数据库压垮(也就是直接放弃一部分请求)

2、解决办法

使用互斥锁。简单地来说,就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db,而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutex key,当操作返回成功时,再进行load db的操作并回设缓存;否则,就重试整个get缓存的方法。

二、缓存穿透

1、概念

穿透就是去查询一个数据库中原本就不存在的数据,这个时候由于数据库里面没有对应的数据,缓存里面当然也不会有,此时该查询就穿透了缓存直接访问数据库了

2、解决办法

  • 1、采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
  • 2、如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

三、缓存雪崩

1、概念

雪崩就是大量的缓存在同一个时间过期,然后巨量的访问请求直接从数据库中查询数据,给数据库带来巨大的压力

2、解决办法

  • 1、对每个缓存设置不同的缓存时间(这个能有效的防止大量缓存同时过期);
  • 2、使用分布式锁(Redission中的lock),缓存失效时锁住之后发送过来的第一个请求,等待其执行完再次把新的缓存数据放入缓存之后再释放锁,给后面的请求放行;
  • 3、使用二级缓存

猜你喜欢

转载自blog.csdn.net/qq_42697271/article/details/117782407