美文网首页
缓存穿透、缓存击穿、缓存雪崩

缓存穿透、缓存击穿、缓存雪崩

作者: 求心丶 | 来源:发表于2021-01-15 13:59 被阅读0次

    缓存穿透

            缓存穿透是指缓存服务器和数据库中都没有符合条件的数据,例如查找id<0的用户,由于该类用户不存在所以缓存中没有对应数据,每次请求进来都会从数据库中进行一次查询;这类请求可能是潜在的攻击者发起的,当请求量很大时会导致数据库压力过大。

    解决方案:

    一、缓存服务器中允许存空值:例如当首次查询id=-2的用户时,在缓存服务器中将null作为value存入,此后查询该用户时直接将缓存服务器中的null返回;应当注意的是,为了查询结果的正确性,在必要时要对null值进行更新,例如,假设此前查询id=999的用户并不存在,缓存服务器中保存了999:null的一条记录,但是随着用户的新增,如果此后创建了id=999的用户,就需要对缓存服务器中的这条记录进行更新。

    二、BloomFilter:大部分情况下,缓存穿透是很多恶意请求引起的,这些请求可能随机生成查询条件进行查询,这些查询条件对应的数据在缓存服务器和数据库中都没有,就容易引起缓存穿透;因此,我们可以将查询的数据条件哈希到一个足够大的布隆过滤器中,请求会首先被布隆过滤器拦截,一定不存在的数据就直接拦截返回了,从而降低对数据库的压力。

    缓存击穿

            缓存击穿是缓存服务器中没有但是数据库中有的数据(例如当该条缓存过期时),如果大并发量请求进来,在缓存服务器中没有此条数据,这些请求同时去数据库中进行查找,造成数据库瞬间压力增大。

    解决方案:

    一、异步更新:通过定时任务在缓存服务器中的数据未过期时对其进行更新。

    二、互斥锁:当Redis中根据key获得的value值为空时,先锁上,然后从数据库加载,加载完毕,释放锁。若其他线程也在请求该key时,发现获取锁失败,则先阻塞;采用互斥锁实际上就是将并行变成串行,会降低系统吞吐量。

    缓存雪崩

            缓存雪崩是指缓存中大量缓存同时过期,而查询数据量巨大,引起数据库压力过大甚至宕机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

    解决方案:

    一、为缓存数据设置不同的过期时间。

    二、缓存服务器集群部署:采用集群部署,避免缓存服务器单点故障。

    相关文章

      网友评论

          本文标题:缓存穿透、缓存击穿、缓存雪崩

          本文链接:https://www.haomeiwen.com/subject/aliiaktx.html