首页 > 其他分享 >缓存雪崩、缓存击穿、缓存穿透原因及解决办法

缓存雪崩、缓存击穿、缓存穿透原因及解决办法

时间:2023-06-12 19:47:50浏览次数:47  
标签:解决办法 缓存 请求 数据库 布隆 访问 雪崩 key

缓存雪崩是指在缓存中的大量数据在同一个时刻全部过期,导致原本这些可以由缓存中间件处理的高并发请求,一下子全部打到数据库,导致数据库服务器崩溃的一种现象。那么出现缓存雪崩的原因可以有①:缓存中间件宕机。②:缓存中大部分key都设置了相同的时间,导致这些key在同一时间内全部失效。解决的方法:

①:可以对这些个key设置可以失效的随机值,避免同时失效的问题。

②:还可以对数据库的读写加锁,不让那么瞬时高并发的请求一下子突然打到数据库上。

③:即使如果真的发生了缓存雪崩,使用数据库的主从复制、双主、读写分离等策略,数据库本身的容灾能力应该还是可以承受住的。

缓存穿透是指缓存穿透是指在使用缓存系统的应用程序中,恶意请求或者无效的请求频繁地访问缓存中不存在的数据,导致大量请求直接访问后端数据库或服务,而绕过了缓存系统的情况。可能出现的原因其实是可出现了恶意攻击行为。对于一个成熟的系统来说,由于缓存预热的不断加载,即便是出现了一个不存在的key,影响也不会很大,那么恶意攻击行为可能具有持久性,确认这个key在数据库中不存在,才会达到这样一个行为。解决的方法:

①:把这些无效的key保存到Redis里面,并设置一个null的特殊值,这样就不会去查数据库了。但是如果攻击者一直恶意攻击同样会出现相同的问题。

②:使用布隆过滤器来实现。把这些数据全部放到布隆过滤器里面,当进行查询时,先到布隆过滤器里面进行查询,如果查询不存在,那么这个key在数据库中肯定也不会存在,那么就不会去访问数据库了。

③:缓存预热,预先加载热点数据到缓存中,避免在某些特定时刻,高并发的请求打到数据库上。

缓存击穿是指当某个热点数据过期或被主动移除时,大量的并发请求同时访问该数据库,导致缓存无法命中,进而直接访问数据库或后端服务。对应的解决方案:

①:设置热点数据的永不过期策略:对于一些非常热点且不经常变动的数据,可以将其缓存设置为永不过期,确保数据一直存在于缓存中,避免了过期导致的击穿问题。

②:延迟缓存更新策略(缓存穿透):当发现某个缓存键对应的数据不存在时,可以采取一定的策略,如先访问数据库或后端服务获取数据,然后将数据写入缓存,避免了多个并发请求同时访问数据库。

③:布隆过滤器(Bloom Filter):布隆过滤器可以用于快速判断某个键是否存在于缓存中,如果布隆过滤器判断键不存在,则不会进一步访问缓存或数据库,从而减轻了缓存击穿的压力。

④:缓存预热(Cache Pre-warming):在系统启动或低峰期,预先加载热点数据到缓存中,使其在高峰期可用,从而避免了高并发请求直接访问数据库。

这里只列出来一小部分方案

标签:解决办法,缓存,请求,数据库,布隆,访问,雪崩,key
From: https://www.cnblogs.com/kuangsun125/p/17475936.html

相关文章

  • Linux RDP 会话中无法打开VSCode 解决办法
    githubissue:VSCode"andstill"won'topeninaLinuxxrdpsessionWorkaround-LinuxRDP会话中无法打开VSCode解决办法ThistimearoundIresolvedtheissuebynarrowingthefollowingHackintwosteps:Copythesystemfile'libxcb.so.1.1.0'......
  • mysql启动报can't create/write to file 'var/run/mysqld/mysqld.pid 错误解决办法
    msql启动报错,启动不了。进入mysql日志默认的路径为/var/log/mysqld.log查看日志,发现报错信息如下:can'tcreate/writetofile'var/run/mysqld/mysqld.pid解决办法:将/var/run/mysqld/权限赋给mysql执行以下命令即可:chown-Rmysql/var/run/mysqldchgrp-Rmysql/var/ru......
  • 【操作系统】【硬件结构】CPU 缓存一致性
    1  前言我们看了存储器的层次结构,知道CPU中有多级缓存,有共享的也有私有的,那么不可避免的一个问题就是缓存的一致性,这节我们来看看哈。2  CPUCache的数据写入随着时间的推移,CPU和内存的访问性能相差越来越大,于是就在CPU内部嵌入了CPUCache(高速缓存),CPUCache离CPU......
  • 基于Go的缓存实现
    概念缓存是计算机科学中的一个重要概念。设想某个组件需要访问外部资源,它向外部源请求资源,接收并使用资源,这些步骤都需要花费时间。当组件再次需要资源时,可以再次请求资源,但这种方式从时间上考虑是比较低效的。相反,组件可以将请求结果保存在本地某处,然后再次使用,使用本地数据总是比......
  • arcgis server 10.4 授权不成功解决办法
    https://enterprise.arcgis.com/zh-cn/server/10.4/install/windows/welcome-to-the-arcgis-for-server-install-guide.htm1、Failedtocreatethesite.  2、server10.4授权不成功解决办法开始-程序  2.1、以记事本方式打开授权文件 2.2、用双斜杠把portal授权行注释掉,......
  • B站缓存.m4s转成可以观看使用的.mp4
    Step1:寻找缓存文件首先把视频缓存到手机然后找到.m4s文件路径一般是这个(作者用的是安卓系统)一个文件夹就是一个缓存视频找到audio.m4s和video.m4sStep2:下载FFmpegFFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序——百度百科具体......
  • Django站点静态文件缓存相关问题
    《高性能网站建设指南》中有一条建议,为网站的页面、文件“添加Expires头”。这么做的好处就不多说了,实现方式也比较简单,不过,真的实施这条建议时,还是有许多问题需要考虑。通常情况下,我们需要将图片、js、css等不会经常更新的文件缓存起来,一般来说,配置服务器,为它们设置一个较远的......
  • Django使用redis缓存服务器
        redis相信大家都很熟悉了,和memcached一样是一个高性能的key-value数据库,至于什么是缓存服务器,度娘都有很明白的介绍了,我在这里就不一一介绍了。那我们一般什么情况下才会使用缓存服务器呢?可不是什么情况都需要的哦,一般来说是在需要频繁对一个字段读取的时候才会需要将这......
  • echart 多变联动下载图片清缓存
    一个系统中有多个图表的时候,多变联动下载他的图片会多出上次预览的图片的一部分 原因是没有清空echart的缓存//赋值变量this.myChart=this.$refs.chart[0]beforeDestroy(){//清缓存//@ts-ignorethis.myChart.clear();this.myChart={}} ......
  • Spring的三级缓存
    学习资料:https://www.bilibili.com/video/BV1dP411J7tQ/?spm_id_from=333.337.search-card.all.click&vd_source=46d50b5d646b50dcb2a208d3946b1598......