首页 > 其他分享 >什么是缓存穿透,缓存击穿,缓存雪崩的详细讲解,以及解决方式?

什么是缓存穿透,缓存击穿,缓存雪崩的详细讲解,以及解决方式?

时间:2024-03-15 11:56:26浏览次数:19  
标签:缓存 请求 数据库 击穿 访问 雪崩 失效 数据

什么是缓存穿透,缓存击穿,缓存雪崩的详细讲解,以及解决方式?

缓存作用:

​ redis缓存加载数据库中的数据,数据库一般在磁盘中,访问磁盘的效率比较低,所以使用redis缓存,将数据加载到运存中,请求访问时直接访问缓存,如果缓存中有结果,直接返回结果,缓存中没有结果,请求会被打到数据库上,在数据库中的查询数据返回给请求,同时也会将数据加载到缓存中。

缓存穿透:

​ 是指恶意访问或者查询一个不存在的数据,导致缓存层无法命中,每次请求都会直接访问数据库,给数据库造成压力,同时降低了系统性能。

缓存穿透产生的原因:
  • 恶意查询:故意发送查询不存在数据的请求,通过大量无效查询来消耗系统资源。
  • 查询参数异常:由于输入参数错误或异常,导致查询的数据在缓存和数据库中都不存在。
  • 缓存失效:缓存中的数据可能因为过期或被删除而导致失效,需要重新加载到缓存中。
缓存穿透的危害:
  • 数据库压力增加:频繁查询不存在的数据会导致大量无效的数据库访问,增加数据库负载。
  • 系统性能下降:频繁的数据库查询会耗尽系统资源,导致系统性能下降和响应时间延长。
  • 安全风险:恶意攻击可能会利用缓存穿透漏洞进行拖库等攻击,造成数据泄露和安全风险。
解决缓存穿透的方法:
  • 布隆过滤器(Bloom Filter):在缓存层使用布隆过滤器对请求参数进行校验,快速判断请求是否合法,避免无效查询访问数据库。
  • 空值缓存:即使查询结果为空,也将空值缓存在缓存中,避免重复查询。可以设置较短的过期时间,确保缓存数据及时更新。
  • 缓存预热:提前加载常用数据到缓存中,预防缓存失效时对数据库的频繁查询,减少缓存穿透的发生。
  • 限流措施:对请求进行限流,设置访问频率阈值,拦截异常请求,保护数据库不受恶意攻击。

缓存击穿:

​ 是指在高并发场景下,一个缓存中的热点数据突然失效,导致大量请求直接访问数据库,使得数据库压力剧增,引起数据库性能问题。

缓存击穿产生原因:
  • 热点数据:某些热点数据的访问频率很高,在缓存失效时会导致大量请求直接访问数据库。
  • 并发访问:在高并发场景下,同时有多个请求等待获取同一份数据,如果此时缓存失效,就会导致大量请求穿透到数据库。
  • 随机性失效:缓存数据设置的过期时间是随机的,当某个热点数据随机失效时,可能导致缓存击穿问题。
缓存击穿的危害:
  • 数据库压力:大量请求穿透到数据库,增加数据库压力,可能导致数据库性能下降,甚至宕机。
  • 系统稳定性:数据库负载过大可能导致系统响应变慢、服务不可用,影响系统整体稳定性。
  • 数据不一致:在缓存失效和重新加载之间,可能导致数据库和缓存中数据不一致的情况发生。
解决缓存击穿的方法:
  • 互斥锁:在缓存失效时,只允许一个线程去查询数据库并更新缓存,其他线程等待结果即可,避免重复查询数据库。
  • 预先加载:定期刷新热点数据,避免缓存在高并发时突然失效,提前加载数据到缓存中。
  • 热点数据永不过期:对于热点数据,设置永不过期或者设置较长的过期时间,避免频繁失效。
  • 降级策略:当缓存失效时,可以返回默认值或者空数据,而不是直接访问数据库,保证系统正常运行。

缓存雪崩:

​ 是指在某个时间点,大量的缓存数据同时失效,导致大量请求直接访问数据库,从而造成数据库负载急剧增加,甚至引发数据库宕机等严重后果。

缓存雪崩产生原因:
  • 相同的过期时间:在某些系统中,可能存在大量缓存数据具有相同的过期时间,在这个过期时间点,这些缓存数据会同时失效。
  • 服务器宕机:整个缓存服务器宕机或者重启,导致所有缓存数据同时不可用。
  • 热点数据:某些热点数据的访问频率很高,一旦缓存失效,大量请求会直接访问数据库。
  • 并发访问:在高并发场景下,同时有大量请求等待获取相同的缓存数据,一旦缓存失效,就会导致大量请求穿透到数据库。
缓存雪崩的危害:
  • 数据库压力激增:大量请求直接访问数据库,导致数据库负载急剧增加,可能引发数据库性能问题甚至宕机。
  • 系统瘫痪:数据库压力过大可能导致系统响应变慢甚至不可用,影响整个系统的稳定性和可用性。
  • 数据不一致:在缓存失效和重新加载之间,可能导致数据库和缓存中数据不一致的情况发生。
避免缓存雪崩的方法:
  • 缓存数据分布均匀:设置不同的缓存数据过期时间,避免大量数据同时失效。
  • 多级缓存:采用多级缓存架构,即使某一级缓存失效,仍然可以从其他级别的缓存获取数据。
  • 热点数据预加载:定期刷新热点数据,避免缓存在高并发时突然失效,提前加载数据到缓存中。
  • 限流降级:对于缓存失效时的大量请求进行限流或者降级处理,保护数据库和系统免受冲击。

标签:缓存,请求,数据库,击穿,访问,雪崩,失效,数据
From: https://www.cnblogs.com/My-knowledge/p/18075098

相关文章

  • 缓存穿透、缓存击穿、缓存雪崩区别
    高并发下缓存雪崩Redis中的数据大面积失效(时间过期)的情景缓存雪崩是指在我们设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。解决方案:均匀过期:给热点数据设置不同的过期时间,给每个key的失效时间加一个随机值;原有的失效时间基......
  • 内存缓存和分布式缓存
    参考官方文档:https://learn.microsoft.com/zh-cn/aspnet/core/performance/caching/overview?view=aspnetcore-6.0内存中缓存可以存储任何对象。分布式缓存接口仅限于byte[],应用程序需要自行解决针对缓存对象的序列化和反序列化问题。内存中和分布式缓存都将缓存项存储为键值......
  • 开启mybatis二级缓存
    mybatis的二级缓存是mapper级别的,也就是同一个mapper下的查询,可以使用缓存里面的值下面就写个demo记录下没有使用缓存之前service@OverridepublicDevicegetUserById(Longid){DevicebyId=deviceMapper.getDeviceById(id);log.info("=======......
  • 陌陌技术分享:陌陌IM在后端KV缓存架构上的技术实践
    本文由冀浩东分享,原题“单核QPS近6000S,陌陌基于OceanBase的持久化缓存探索与实践”,为了阅读便利,本文进行了排版和内容优化等。1、引言挚文集团于2011年8月推出了陌陌,这款立足地理位置服务的开放式移动视频IM应用在中国社交平台领域内独树一帜。陌陌和探探作为陌生人社交领......
  • 缓存把我坑惨了..
    故事春天,办公室外的世界总是让人神往的,小猫带着耳机,托着腮帮,望着外面美好的春光神游着...一声不和谐的座机电话声打破这份本该属于小猫的宁静,“hi,小猫,线上有个客户想购买A产品规格的商品,投诉说下单总是失败,帮忙看一下啥原因。”客服部小姐姐甜美的声音从电话那头传来。“哦哦,好,......
  • 10.缓存
    1.常见的缓存策略有哪些,如何做到缓存(比如redis)与DB里的数据一致性,你们项目中用到了什么缓存系统,如何设计的。缓存策略:Cache-Aside:最常见的缓存策略,当客户端请求数据时,程序会检查缓存中是否存在数据,若存在缓存命中(CacheHit),若不存在(CacheMiss)则从数据库中查询数据并存储在缓......
  • 如何实现缓存与LRU算法以及惰性过期
    如何实现缓存与LRU算法以及惰性过期实现缓存概述与LRU算法详解缓存的基本概念与作用在计算机科学中,缓存是一种临时存储数据的技术,用于加速数据访问速度。通过将常用数据存储在高速缓存中,可以减少对慢速存储器(如磁盘或数据库)的访问次数,从而提高系统的性能和响应速度。缓存......
  • Spring核心思想之 AOP:如何影响DI并引入三级缓存解决DI中涉及代理的问题
    Spring中AOP的实现与在Spring核心思想之AOP:在自定义容器基础上实现AOP功能中实现的自定义AOP一样,采用后置处理器方式。在Spring的核心思想之DI:详解SpringDI循环依赖实现机制文中末尾提到了一个问题,为什么是三级缓存而不是二级。下面示例AOP是如何影响DI的?......
  • 如何配置极狐GitLab Runner Cache 缓存
    本文作者:徐晓伟GitLab是一个全球知名的一体化DevOps平台,很多人都通过私有化部署GitLab来进行源代码托管。极狐GitLab是GitLab在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。极狐GitLabRunnerCache缓存支持S3标准协议,如:OSS、OOS等等支持S3......
  • 动态缓存单个页面-vue3-实现思路
    状态管理定义-全局状态属性`keepNameArray``noKeepNameArray` (为数组)动态组件缓存设置<keep-alive:include="keepNameArray":exclude="noKeepNameArray"><component:is="Component"/></keep-alive>该文件获取keepNameArray和noKeepNameA......