首页 > 其他分享 >缓存击穿和缓存穿透

缓存击穿和缓存穿透

时间:2024-08-04 09:52:49浏览次数:17  
标签:缓存 请求 过期 数据库 击穿 穿透

缓存击穿和缓存穿透都是缓存系统中可能出现的问题,但它们的原因和解决方法有所不同。

 

### 缓存击穿

缓存击穿通常发生在高并发场景下,当某个热门数据的缓存刚好过期时,大量请求同时到达,发现缓存中没有数据,因此这些请求会直接落到后端数据库,导致数据库瞬间压力激增,这种情况称为缓存击穿。

 

#### 解决方法:

1. **缓存空值**:当数据库查询结果为空时,仍然将空值存储到缓存中,并设置一个过期时间,防止短时间内重复查询。

2. **使用互斥锁**:利用分布式锁,确保在缓存失效后,只有一个请求能够去数据库获取数据,其他请求等待这个请求的结果。

3. **预加载缓存**:在数据即将过期前,通过后台任务主动刷新缓存,避免缓存过期时的集中访问。

4. **限流**:限制单位时间内对数据库的请求次数,防止数据库被瞬间大量请求击垮。

 

### 缓存穿透

缓存穿透是指查询一个一定不存在的数据,由于缓存和数据库中都没有该数据,所以每次请求都会直接打到数据库上,这也会导致数据库压力增大,如果这种查询特别多,就构成了缓存穿透。

 

#### 解决方法:

1. **缓存空值**:与缓存击穿的解决方式类似,当发现请求的key不存在时,仍然将这个key和null值或者特殊标识符存储到缓存中,并设置一个过期时间,这样可以避免下次相同key的请求再次穿透到数据库。

2. **黑白名单**:对于恶意的请求,可以设置黑名单,拒绝这些请求的访问。

3. **接口参数校验**:在请求到达缓存之前,对请求参数进行有效性验证,过滤掉非法请求。

4. **布隆过滤器**:使用布隆过滤器预先判断数据是否存在,只有可能存在时才进行数据库查询,减少无效请求。

 

总结来说,缓存击穿和缓存穿透的主要区别在于,缓存击穿是因为缓存中原本有的数据过期后,短时间内大量请求同时尝试从数据库获取数据;而缓存穿透是因为请求的数据在缓存和数据库中都不存在,导致请求每次都直接落到底层数据库。解决这两种问题的核心思路都是尽量避免请求直接打到数据库,通过缓存空值、限流、预加载等手段来减轻数据库的压力。

 

标签:缓存,请求,过期,数据库,击穿,穿透
From: https://blog.csdn.net/weixin_43803780/article/details/140559702

相关文章

  • 如何理解先删除缓存还是先修改数据库。
        针对这个问题,其实反过来更好理解,即“先删除缓存还是先修改数据库能保证数据一致”变为“数据不一致的条件是什么”,好,现在就经过第一步转换了,接下来就解决这个问题。    数据不一致其实就是在经过缓存删除和数据库修改变化后缓存中是旧数据,数据库是新数据。更新......
  • 攻破工程级复杂缓存难题--企业实战
    缓存技术在现代分布式系统中至关重要,不仅提升了系统性能,还减轻了后端数据库的压力。然而,缓存系统也面临着诸多挑战,如缓存穿透、缓存雪崩、缓存击穿和热点key问题。通过多种策略的综合应用,包括本地缓存、双缓存方案、多级缓存、多副本、热点key拆分和动态分散等,可以有效应对这些......
  • 攻破工程级复杂缓存难题--企业实战
    缓存技术在现代分布式系统中至关重要,不仅提升了系统性能,还减轻了后端数据库的压力。然而,缓存系统也面临着诸多挑战,如缓存穿透、缓存雪崩、缓存击穿和热点key问题。通过多种策略的综合应用,包括本地缓存、双缓存方案、多级缓存、多副本、热点key拆分和动态分散等,可以有效应对这些......
  • Linux: 利用缓存优化Docker镜像构建
    在现代软件开发中,容器化应用程序已成为标准做法之一。Docker作为容器技术的领军者,其高效的构建和部署能力深受开发者喜爱。然而,随着项目复杂度的增加,构建Docker镜像的时间也在不断增加。合理利用Docker的缓存机制,可以大大提高镜像构建的速度。接下来将详细介绍如何通过优化......
  • 在flask缓存中指定每个函数的缓存阈值(执行函数时清除旧值)
    使用flask-caching时memoize的默认行为是如果指定的超时已到则执行该函数,然后返回并保存新结果。但是,现在过时的(之前缓存的)结果不会被删除。这对于大多数应用程序来说没问题,但如果缓存结果很大,就会出现问题。flask-caching暴露CACHE_THRESHOLD......
  • 本地部署动态服务发现管理平台Nacos结合内网穿透实现远程访问管理
    文章目录前言1.Docker运行Nacos2.本地访问Nacos3.Linux安装Cpolar4.配置NacosUI界面公网地址5.远程访问NacosUI界面6.固定NacosUI界面公网地址7.固定地址访问Nacos前言本文主要介绍如何本地部署动态服务发现、配置管理和服务管理平台Nacos,并结合cpola......
  • 全面击破工程级复杂缓存难题
    目录一、走进业务中的缓存(一)本地缓存(二)分布式缓存二、缓存更新模式分析(一)CacheAsidePattern(旁路缓存模式)读操作流程写操作流程流程问题思考问题1:为什么不是先删缓存,再更新数据库?问题2:为什么更新操作是将cache失效,而不是更新?CacheAsidePattern模式不一致问题的发......
  • Spring学习(四)三级缓存
    至此,总结一下三级缓存:singletonObjects:缓存经过了完整生命周期的beanearlySingletonObjects:缓存未经过完整生命周期的bean,如果某个bean出现了循环依赖,就会提前把这个暂时未经过完整生命周期的bean放入earlySingletonObjects中,这个bean如果要经过AOP,那么就会把代理对象放入early......
  • Frpc 内网穿透客户端配置教程
    github:https://github.com/fatedier/frp/releases1下载操作系统对应版本的Frpc.exe客户端程序2配置对应的frpc.ini文件3切换到Frpc.exe目录,cmd执行:Frpc.exe-cfrpc.ini 例如:frpc.ini如下例如 frps服务地址:10.10.10.10 端口10000本地服务端口5000,  frps域......
  • 内网穿透公众号开本地nginx发环境配置(花生壳和量子互联)
    昨天搞了一天,这儿总结一下,免得以后忘了 nginx收入80端口  所以穿透的工具局域网设80    其它端口根据软件应用配置花生壳的通道要选https  量子互联的话tcp配置启动https就可以nginx 我用1.24没有能成功  1.20成功了,不知道啥原因nginx配置时注意全文,都......