缓存穿透了怎么办?

简介: 缓存穿透了怎么办?

缓存穿透了怎么办?



对应缓存来说,命中率是它的生命线。

在缓存命中率低的情况下,大量查询请求会穿透缓存到数据库,因为数据库对于并发的承受能力有限,一旦数据库承受不了大量查询任务,就会导致查询变慢,导致大量的请求阻塞在数据库查询上,造成应用服务器的连接和线程资源被占满,最终导致系统崩溃。


什么是缓存穿透


缓存穿透,其实是指从缓存中没有找到数据,不得已查询数据库的情况。

少量的缓存穿透没问题,主要由如下几点原因:

  • 一方面,缓存系统在容量上有限,不可能所有的数据都存储在缓存中
  • 另外一方面,互联网系统遵守 8/2 法则,也叫 帕雷托法则,最重要的事情只占 20%, 数据库访问,经常访问 20% 的热点数据,还有 80% 不会被经常访问。


什么样的缓存穿透对象系统有害


少量的缓存穿透是不可避免的,但是大量的请求穿透请求到后端系统,会造成系统后端崩溃。


如何解决缓存穿透


假设有这样一种场景:通过userid 查询用户信息,缓存读写策略是先查缓存,后查数据库。如果数据并不存在,在缓存和数据库中都没查询到数据,因此不会回种数据,这样下次请求到来,还是会先查缓存后查数据库,这种场景下,请求就穿透到了数据库。


回种空值


最大的问题在于数据库中不存在用户的数据,这样无理查询多少次,数据库中用于都不会存在这个用户的数据,一直会出现缓存穿透,因此,可以当数据从数据库查询为空或者发生异常时,在缓存中回种一个空值,给空值设置一个较短的过期时间,让短时间内能够快速过期淘汰。


Object nullValue =  new Object();
try {
 Object valueFromDB= getFromDB(uid);//从数据库中查询数据
 if(valueFromDB = null){
     cache.set(uid, nullValue,10);//如果从数据库中查询到空值,就把空值写入
 } else {
   cache.set(uid, value FromDB, 1000);
}catch(Exception e){
  cache.set(uid, nullValue, 10);
}


回种空值虽然能够阻挡大量的穿透请求,但是如果有大量的空值缓存,也就会浪费存储空间,就浪费缓存的存储空间。甚至会剔除掉另外一些已经把缓存的用户信息反而会造成命中率下降。


布隆过滤器


布隆过滤器可以用来判断一个元素是否存在一个集合中,这个算法由 二进制和 Hash 算法组成,它的基本思路:

我们把集合中的每一个值提供的 Hash 算法算出对应的 Hash 值,然后对Hash 值对数组长度取模后得到需要计入数组的索引值,并将数组这个位置的值从0改成1,再判断一个元素是否存在这个集合中,只需要将这个元素按照相同的算法计算出索引值。如果这个位置为1,就认为这个元素在集合中,否则不在集合中。


640.png


新建的用户需要写入数据库中,还更新布隆过滤器数组相应位置的值,当查询一个用户是否存在时,可以先查询布隆过滤器是否存在,如果不存在就直接返回,不需要查询数据库,这样的话可以极大的减少缓存穿透。

布隆过滤器有什么问题呢?我们下期聊!

相关文章
|
1月前
|
缓存 数据库
14- 什么是缓存穿透 ? 怎么解决 ?
# 缓存穿透问题与解决方案 缓存穿透是指查询数据库和缓存中都不存在的数据,导致持续对数据库造成压力。解决方法包括: 1. 缓存空对象:简单但效果有限。 2. 布隆过滤器:效果好但实现复杂。
37 4
|
1月前
|
存储 缓存 NoSQL
redis缓存雪崩、穿透、击穿
redis缓存雪崩、穿透、击穿
|
29天前
|
缓存 监控 NoSQL
redis 缓存穿透 击穿 雪崩 的原因及解决方法
redis 缓存穿透 击穿 雪崩 的原因及解决方法
|
3天前
|
存储 缓存 监控
详解缓存雪崩、缓存击穿、缓存穿透问题,一文掌握,干货不断
详解缓存雪崩、缓存击穿、缓存穿透问题,一文掌握,干货不断
|
1月前
|
缓存 数据库 NoSQL
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?--主从切换方案
【5月更文挑战第16天】该方案提出了解决Redis缓存穿透、击穿和雪崩问题的策略。通过使用两个或多个互为备份的Redis集群,确保在单个集群故障时,另一个可以接管。在故障发生时,业务会与备用集群保持心跳检测,并根据业务重要性分批转移流量,逐步增加对备用集群的依赖,同时监控系统稳定性。对于成本敏感的小型公司,可以采用低成本的单机或小规模自建Redis备份。此方案强调渐进式流量转移,以保护系统免受突然压力冲击。
31 1
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?--主从切换方案
|
1天前
|
缓存 NoSQL Java
Redis系列学习文章分享---第四篇(Redis快速入门之Java客户端--商户查询缓存+更新+双写一致+穿透+雪崩+击穿+工具封装)
Redis系列学习文章分享---第四篇(Redis快速入门之Java客户端--商户查询缓存+更新+双写一致+穿透+雪崩+击穿+工具封装)
6 0
|
1天前
|
缓存 NoSQL Java
避免缓存失效的三大杀手:缓存击穿、穿透与雪崩的解决方案
避免缓存失效的三大杀手:缓存击穿、穿透与雪崩的解决方案
6 0
|
1月前
|
存储 缓存 NoSQL
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?---解决缓存穿透
【5月更文挑战第14天】解决缓存穿透问题有两种策略。一是回写特殊值,当数据不存在时,在缓存中存储特殊值以标记,避免下次重复查询数据库。但此方法可能被恶意请求利用,浪费内存。二是使用布隆过滤器,预先判断数据是否存在,减少无效数据库查询。布隆过滤器虽有假阳性可能,但概率低,可接受。此外,可先查缓存再查布隆过滤器,优化正常请求的效率。两种方式各有优劣,实际应用需根据场景选择。
30 3
|
1月前
|
缓存 监控 数据库
分布式系统中缓存穿透问题与解决方案
在分布式系统中,缓存技术被广泛应用以提高系统性能和响应速度。然而,缓存穿透是一个常见而严重的问题,特别是在面对大规模请求时。本文将深入探讨缓存穿透的原因、影响以及一些有效的解决方案,以确保系统在面对这一问题时能够保持稳定和高效。
48 13
|
1月前
|
缓存 数据库 算法
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?---解决缓存击穿和雪崩、限流
【5月更文挑战第15天】本文介绍了如何解决缓存击穿和雪崩问题。对于缓存击穿,采用singleflight模式,确保即使热点数据导致大量请求未命中缓存,也只允许一个请求真正查询数据,其他请求等待其结果。对于缓存雪崩,解决方案是在设置过期时间时添加随机偏移量,避免所有数据同时过期。偏移量应与过期时间成正比。此外,限流也是一个重要策略,可以在服务层和数据库层实施,以限制请求流量,保护数据库免受高并发压力。
26 0
【后端面经】【缓存】35|缓存问题:怎么解决缓存穿透、击穿和雪崩问题?---解决缓存击穿和雪崩、限流