深入理解缓存之缓存存在的问题及应对措施

解决Qt的列表加载大量数据卡顿的问题 本人在使用QListView插入大量数据时,界面卡顿十分严重。数据量大概只有上千左右,但是每个Item的内容比较多。当数据不停地插入一段时间后,卡顿到鼠标的移动都有点困难。 阅读详情

GitHub:https://github.com/JDawnF

1.缓存穿透

指查询一个一定不存在的数据,由于缓存是不命中时被动写( 被动写,指的是从 DB 查询到数据,则更新到缓存中 )的,并且处于容错考虑,如果从 DB 查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到 DB 去查询,失去了缓存的意义。

缓存穿透问题可能会使后端存储负载加大,由于很多后端存储不具备高并发性,甚至可能造成后端存储宕掉。通常可以在程序中分别统计总调用数、缓存层命中数、存储层命中数,如果发现大量存储层空命中,可能就是出现了缓存穿透问题。

参照:Redis架构之防雪崩设计:网站不宕机背后的兵法

在流量大时,可能 DB 就挂掉了,要是有人利用不存在的 key 频繁攻击我们的应用,这就是漏洞。如下图:

有两种方案可以解决:

  • 方案一,缓存空对象:当从 DB 查询数据为空,我们仍然将这个空结果进行缓存,具体的值需要使用特殊的标识,能和真正缓存的数据区分开。另外,需要设置较短的过期时间,一般建议不要超过 5 分钟。

    缓存空对象会有两个问题:

    第一,空值做了缓存,意味着缓存层中存了更多的键,需要更多的内存空间 ( 如果是攻击,问题更严重 ),比较有效的方法是针对这类数据设置一个较短的过期时间,让其自动剔除。

    第二,缓存层和存储层的数据会有一段时间窗口的不一致,可能会对业务有一定影响。例如过期时间设置为 5 分钟,如果此时存储层添加了这个数据,那此段时间就会出现缓存层和存储层数据的不一致,此时可以利用消息系统或者其他方式清除掉缓存层中的空对象。

    伪代码:

     

  • 方案二,BloomFilter 布隆过滤器:在缓存服务的基础上,构建 BloomFilter 数据结构,在 BloomFilter 中存储对应的 KEY 是否存在,如果存在,说明该 KEY 对应的值为空。那么整个逻辑的如下:

    • 1、根据 KEY 查询缓存。如果存在对应的值,直接返回;如果不存在,继续向下执行。

    • 2、根据 KEY 查询在缓存 BloomFilter 的值。如果存在值,说明该 KEY 不存在对应的值,直接返回空;如果不存在值,继续向下执行。

    • 3、查询 DB 对应的值,如果存在,则更新到缓存,并返回该值。如果不存在值,更新到 缓存 BloomFilter 中,并返回空。

    如下图所示,在访问缓存层和存储层之前,将存在的 key 用布隆过滤器提前保存起来,做第一层拦截。例如: 一个个性化推荐系统有 4 亿个用户 ID,每个小时算法工程师会根据每个用户之前历史行为做出来的个性化放到存储层中,但是最新的用户由于没有历史行为,就会发生缓存穿透的行为,为此可以将所有有个性化推荐数据的用户做成布隆过滤器。如果布隆过滤器认为该用户 ID 不存在,那么就不会访问存储层,在一定程度保护了存储层。

    可以利用 Redis 的 Bitmaps 实现布隆过滤器,GitHub 上已经开源了类似的方案,可以进行参考:

    https://github.com/erikdubbelboer/Redis-Lua-scaling-bloom-filter

    这种方法适用于数据命中不高,数据相对固定实时性低(通常是数据集较大)的应用场景,代码维护较为复杂,但是缓存空间占用少。

本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。

布隆过滤器是一个 bit 向量或者说 bit 数组,长这样:

对于每个key,只需要k个比特位,每个存储一个标志,用来判断key是否在集合中。

 

  1. 首先需要k个hash函数,每个函数可以把key散列成为1个整数

  2. 初始化时,需要一个长度为n比特的数组,每个比特位初始化为0

  3. 某个key加入集合时,用k个hash函数计算出k个散列值,并把数组中对应的比特位置为1

  4. 判断某个key是否在集合时,用k个hash函数计算出k个散列值,并查询数组中对应的比特位,如果所有的比特位都是1,认为在集合中。

参照:https://www.jianshu.com/p/2104d11ee0a2

https://www.cnblogs.com/liyulong1982/p/6013002.html

两者比较:

 缓存空对象BloomFilter 布隆过滤器
适用场景1、数据命中不高 2、保证一致性1、数据命中不高 2、数据相对固定、实时性低
维护成本1、代码维护简单 2、需要过多的缓存空间 3、数据不一致1、代码维护复杂 2、缓存空间占用小

2.缓存雪崩

缓存雪崩,是指缓存由于某些原因无法提供服务( 例如,缓存挂掉了 ),所有请求全部达到 DB 中,导致 DB 负荷大增,最终挂掉的情况。

从下图可以很清晰出什么是缓存雪崩:由于缓存层承载着大量请求,有效的保护了存储层,但是如果缓存层由于某些原因整体不能提供服务,于是所有的请求都会达到存储层,存储层的调用量会暴增,造成存储层也会挂掉的情况。 缓存雪崩的英文原意是 stampeding herd(奔逃的野牛),指的是缓存层宕掉后,流量会像奔逃的野牛一样,打向后端存储。

解决方案

1)缓存高可用

通过搭建缓存的高可用,避免缓存挂掉导致无法提供服务的情况,从而降低出现缓存雪崩的情况。

假设我们使用 Redis 作为缓存,则可以使用 Redis Sentinel 或 Redis Cluster 实现高可用。

2)本地缓存

如果使用本地缓存时,即使分布式缓存挂了,也可以将 DB 查询到的结果缓存到本地,避免后续请求全部到达 DB 中。当然,引入本地缓存也会有相应的问题,例如说:

  • 本地缓存的实时性怎么保证?

    • 方案一,可以引入消息队列。在数据更新时,发布数据更新的消息;而进程中有相应的消费者消费该消息,从而更新本地缓存。

      也可以使用 Redis Pub / Sub 取代消息队列来实现,但此时 Redis 可能已经挂了,所以也不一定合适。

    • 方案二,设置较短的过期时间,请求时从 DB 重新拉取。

    • 方案三,手动设置Redis过期时间。

  • 每个进程可能会本地缓存相同的数据,导致数据浪费?

    • 方案一,需要配置本地缓存的过期策略和缓存数量上限。

如果我们使用 JVM ,则可以使用 Ehcache、Guava Cache 实现本地缓存的功能。

3)请求 DB 限流

通过限制 DB 的每秒请求数,避免把 DB 也打挂了。这样至少能有两个好处:

  1. 可能有一部分用户,还可以使用,系统还没死透。

  2. 未来缓存服务恢复后,系统立即就已经恢复,无需在处理 DB 也挂掉的情况。

如果我们使用 Java ,则可以使用 Guava RateLimiter、Sentinel 实现限流的功能。

4)服务降级

如果请求被限流,或者请求 DB 超时,我们可以服务降级,提供一些默认的值,或者友情提示,甚至空白的值也行。

如果我们使用 Java ,则可以使用 Hystrix、Sentinel 实现限流的功能。

5)提前演练

在项目上线前,演练缓存宕掉后,应用以及后端的负载情况以及可能出现的问题,在此基础上做一些预案设定。

3.缓存击穿

缓存击穿,是指某个极度“热点”数据在某个时间点过期时,恰好在这个时间点对这个 KEY 有大量的并发请求过来,这些请求发现缓存过期一般都会从 DB 加载数据并回设到缓存,但是这个时候大并发的请求可能会瞬间 DB 压垮。

  • 对于一些设置了过期时间的 KEY ,如果这些 KEY 可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。这个时候,需要考虑这个问题。

    重建缓存不能在短时间完成,可能是一个复杂计算,例如复杂的 SQL、多次 IO、多个依赖等。

    在缓存失效的瞬间,有大量线程来重建缓存 ( 如下图),造成后端负载加大,甚至可能会让应用崩溃。

     

  • 缓存被“击穿”的问题,和缓存“雪崩“”的区别在于,前者针对某一 KEY 缓存,后者则是很多 KEY 。

  • 缓存被“击穿”的问题,和缓存“穿透“”的区别在于,这个 KEY 是真实存在对应的值的。

解决方案

  • 方案一,使用互斥锁:请求发现缓存不存在后,去查询 DB 前,使用分布式锁,保证有且只有一个线程去查询 DB ,并更新到缓存。流程如下:

    • 1、获取分布式锁,直到成功或超时。如果超时,则抛出异常,返回。如果成功,继续向下执行。

    • 2、再去缓存中。如果存在值,则直接返回;如果不存在,则继续往下执行。因为,获得到锁,可能已经被“那个”线程去查询过 DB ,并更新到缓存中了。

    • 3、查询 DB ,并更新到缓存中,返回值。

    下面代码使用 Redis 的 setnx 命令实现上述功能。

     

  • 方案二,手动过期:缓存上从不设置过期时间,功能上将过期时间存在 KEY 对应的 VALUE 里,如果发现要过期,通过一个后台的异步线程进行缓存的构建,也就是“手动”过期。通过后台的异步线程,保证有且只有一个线程去查询 DB。

    整个过程如下图所示:

    从实战看,此方法有效杜绝了热点 key 产生的问题,但唯一不足的就是重构缓存期间,会出现数据不一致的情况,这取决于应用方是否容忍这种不一致。下面代码使用 Redis 进行模拟:

     

作为一个并发量较大的应用,在使用缓存时有三个目标:第一,加快用户访问速度,提高用户体验。第二,降低后端负载,减少潜在的风险,保证系统平稳。第三,保证数据“尽可能”及时更新。下面将按照这三个维度对上述两种解决方案进行分析。

  • 互斥锁 (mutex key):这种方案思路比较简单,但是存在一定的隐患,如果构建缓存过程出现问题或者时间较长,可能会存在死锁和线程池阻塞的风险,但是这种方法能够较好的降低后端存储负载并在一致性上做的比较好。

  • " 永远不过期 ":这种方案由于没有设置真正的过期时间,实际上已经不存在热点 key 产生的一系列危害,但是会存在数据不一致的情况,同时代码复杂度会增大。

这两个方案,各有其优缺点。

 使用互斥锁手动过期
优点1、思路简单 2、保证一致性1、性价最佳,用户无需等待
缺点1、代码复杂度增大 2、存在死锁的风险1、无法保证缓存一致性

 

【Redis】深入理解缓存——从概念到实战,解决缓存穿透、雪崩与击穿问题 本文全面介绍了缓存的概念、作用及使用方法。首先解释了缓存即数据交换的缓冲区,通过示例展示了不同类型的缓存实现,如 Java 中的本地缓存。阐述了使用缓存的原因在于其速度快能降低服务器读写压力,但也会增加代码复杂度和运营成本。接着详细介绍了多级缓存的构成,包括浏览器缓存、应用层缓存、数据库缓存和 CPU 缓存等。 阅读详情

相关推荐

深入理解MyBatis的一级缓存和二级缓存机制

在现代Java企业级应用开发中,MyBatis作为一款优秀的持久层框架,因其灵活性和高性能而广受欢迎。缓存作为提升数据库访问性能的关键技术,在MyBatis中有着精妙的实现。本文将全面剖析MyBatis的一级缓存和二级缓存机制,从基础概念到高级应用,帮助开发者深入理解并合理运用MyBatis缓存来优化应用性能。

vvilkin的学习备忘 943

.Net中的缓存问题

缓存是一种用空间换取时间的技术。缓存存在失效问题,为了保证从缓存中读取的数据和从数据库中读取的数据一致,则需要在数据库中对应的数据发生变化的时候,清除缓存中相应的数据。 if(Cache["dataList"] == null) { 查询数据库…… Cache["dataList"] = list; //设置aspx页面内部的缓存 } else { list = Cache["da

写代码的蜗牛 1303

非易失存储器读写

24C256、IIC_SCL、IIC_SDA

CT_1104的专栏 2986

[转帖]终于明白为什么要“分库分表”了!

终于明白为什么要“分库分表”了! 随着互联网产业的蓬勃发展,在互联网应用上产生的数据也是与日俱增。产生大量的交易记录和行为记录,它们的存放和分析是我们需要面对的问题。 作者:崔皓来源:51CTO技术栈|2019-09-09 08:28 收藏 分享 http://database.51cto.com/art/201909/602634.htm ...

weixin_30265103的博客 271

逆变器技术解析:DDSRF双解耦在正负序分离中的关键作用

本文深入解析了DDSRF双解耦技术在逆变器正负序分离中的关键作用。通过建立正反旋转坐标系并利用交叉反馈解耦网络,DDSRF能快速、精准地分离电网电压中的正负序分量,从而显著提升锁相环在电网不平衡条件下的精度与系统稳定性,是现代高性能并网逆变器的核心算法之一。

m3n5b7v8c9x的博客 410

PaddleOCR在医疗票据识别中的实战:从部署到业务字段提取

本文详细介绍了PaddleOCR在医疗票据识别中的实战应用,重点阐述了其离线部署方案与PP-OCRv3模型选型优势。针对医疗票据敏感数据不出本地的合规要求,文章提供了从环境搭建、模型配置到核心字段提取策略的完整流程,并分享了性能优化与系统集成的实践经验,有效解决了医疗票据自动化录入的难题。

weixin_29271053的博客 236

4种常见的缓存问题及解决方案详解

前言 使用缓存可以缓解大流量压力,显著提高程序的性能。我们在使用缓存系统时,尤其是大并发情况下,经常会遇到一些“疑难杂症”。本文总结了一些使用缓存时常见的问题及解决方案,以后在遇到这类问题时可以作为参考,在设计缓存系统的时候也应该考虑这些常见的情况。 为了表述方便,本文以数据库查询缓存为例,使用缓存可以减小对数据库的压力。 缓存穿透 我们在使用缓存时,往往先尝试去缓存中取值,如果...

程序员追风的博客 2076

Groq LPU架构解析:确定性线性处理器如何重塑AI推理

语言模型推理正从‘通用算力堆叠’转向‘确定性硬件定制’。LPU(Language Processing Unit)作为一种面向大模型推理的领域专用处理器,摒弃传统GPU的并行调度、多级缓存与动态执行范式,转而采用空间计算、静态编译与单线程线性流水线设计,实现纳秒级延迟可控性和92%+的HBM带宽利用率。其核心价值在于将模型结构、内存访问、时序路径全部在编译期固化,从而消除运行时抖动——这正是当前MLOps工程师应对A100显存碎片、vLLM调度开销与P99延迟不稳等痛点的关键技术路径。Groq 3 LPU与

weixin_30599521的博客 327

缓存的七大经典问题

缓存在使用过程不可避免会遇到一些问题,这些问题也是面试中常被问及的问题,对于高频的问题大概归为了7类。具体内容下面如下 1、缓存集中失效 当业务系统查询数据时,首先会查询缓存,如果缓存中数据不存在,然后查询DB再将数据预热到Cache中,并返回。缓存的性能比 DB 高 50~100倍以上。 很多业务场景,如:秒杀商品、微博热搜排行、或者一些活动数据,都是通过跑任务方式,将DB数据批量、集中预热到缓存中,缓存数据有着近乎相同的过期时间。 当过这批数据过期时,会一起过期,此时,对这批数据的所有请求.

fan1865221的博客 947

我正用AI Agent重构传统GIS 核心功能,说大白话做空间分析

GeoAI-UP项目通过AI Agent技术实现自然语言驱动的空间分析,核心创新包括: 意图识别层:通过LLM理解用户需求,自动拆解为可执行目标 智能任务规划:动态生成分析流程,处理复杂依赖关系 统一算子架构:采用标准化接口封装200+空间分析功能 可视化工作流。

专注GIS软件开发。 496

生成模型实战 | ProGAN详解与实现

Progressive GAN (ProGAN) 是一种通过渐进式增长网络结构来生成高分辨率、高保真图像的技术。传统 GAN 难以直接生成超过 256x256 分辨率的图像,而 ProGAN 创新性地从低分辨率开始训练生成器和判别器,逐步添加网络层以提高分辨率,直至达到1024x1024。该方法结合了像素归一化、小批次统计信息和均衡化学习率等关键技术,并使用 WGAN-GP 损失函数确保训练稳定性。ProGAN 是首个能生成1024x1024高保真人脸图像的模型,但其训练耗时较长,且对计算资源要求较高。

盼小辉丶的博客 1434

深入理解缓存容灾:应对高并发下的三大致命风险

在高并发系统中,缓存机制是提升性能的关键,但若处理不当,可能导致“缓存穿透”、“缓存击穿”和“缓存雪崩”等问题,进而引发系统崩溃。本文通过Flask + Redis的接口Demo,探讨了如何构建有效的缓存防护机制。针对缓存穿透,建议缓存空值;对于缓存击穿,采用互斥锁和热点隔离策略;而缓存雪崩则可通过随机化过期时间和预加载来缓解。文章还提供了代码示例,展示了如何在电商秒杀系统和用户查询接口中应用这些策略。最后,强调了架构的渐进式演进,并展望了未来可能的优化方向,如双层缓存和异步刷新机制。通过这些措施,可以有效

记录从移动端、鸿蒙到物联网与AI的完整实战与思考。专注于分享可复用的工程方案与产品思维,尤其深入鸿蒙生态与全栈开发。以十年工程与管理沉淀,为你提供清晰的技术纵深路径。坚信技术的价值在于“贯通”与“落地”。 1966

Open3D 实现CSF布料模拟算法【2025最新版】

CSF布料模拟算法在open3d模块下的实现,博客长期更新,本文最近更新时间为:2025年1月16日。。

点云侠的博客 5746

一文彻底分清缓存穿透、缓存击穿、缓存雪崩问题(含记忆技巧)

缓存穿透是指用户请求的数据在缓存中不存在即没有命中,同时在数据库中也不存在,导致用户每次请求该数据都要去数据库中查询一遍。如果有恶意攻击者不断请求系统中不存在的数据,会导致短时间大量请求落在数据库上,造成数据库压力过大,甚至导致数据库承受不住而宕机崩溃。那么,我们该怎么记忆缓存穿透呢?我们可以这么想,缓存穿透其实就是恶意攻击,就是有人想“穿”过你的防护网(缓存)来“偷”你的家(数据库),这也就是穿透。或者你这样想,有人想恶意攻击你的数据库,这是不是不好的行为,是不是小偷的行为!

胜人者有力,自胜者强! 1万+

YOLOv8【项目实战四】遥感图像目标检测:应对特殊场景的挑战,如何处理遥感图像通常具有的大尺寸、多尺度、方向多变等特点,并对 YOLOv8 进行相应调整(含源码)

遥感图像目标检测优化策略 核心挑战 图像尺寸大:遥感图像通常达数万像素,直接缩放导致小目标丢失 多尺度目标:同一图像包含几十像素的小目标和跨图像的大目标 方向多样性:目标360度任意旋转,水平框检测效果差 优化解决方案 滑动窗口分块处理: 采用1024x1024窗口大小 设置20%-30%重叠率防止边界漏检 全局坐标转换实现检测结果拼接 多尺度特征融合: 改进FPN结构增强小目标检测 自适应感受野处理不同尺寸目标 上下文信息聚合提升检测精度 旋转目标检测: 引入旋转边界框表示 角度预测分支增强方向感知 旋转

深耕 Vue 生态与 JS/TS 技术,聚焦组件封装、响应式原理、TS 类型设计,解析工程化配置与性能优化方案。同时分享 YOLOv8 目标检测实战、AI 大模型面试核心考点,以代码实例拆解技术实现与业务解法。 618

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

深入理解缓存穿透、缓存击穿、缓存雪崩

本文将深入探讨这三种情况的概念、原因以及解决方案。缓存击穿是指一个非常热点的数据,在缓存过期的一瞬间,同时有大量的请求来访问这个数据,由于缓存中没有该数据,这些请求都会落到数据库上,从而导致数据库压力瞬间增大。缓存雪崩是指在某一时刻,缓存中大量的数据同时过期,或者缓存服务出现故障,导致所有的请求都落到数据库上,从而使数据库压力瞬间增大,甚至可能导致数据库崩溃。缓存穿透是指查询一个一定不存在的数据,由于缓存中没有该数据,所有的请求都会落到数据库上,从而导致数据库压力过大,甚至可能使数据库崩溃。

持续分享有趣的技术干货 994

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java面试必备:分布式缓存核心问题与应对策略

分布式缓存面试考察的是系统化解决问题的能力。理解本质:每个问题背后的根本原因和影响范围方案对比:不同解决方案的优缺点和适用场景工程实践:如何将理论方案落地到实际项目中全局视野:缓存与系统其他组件的关系和影响掌握这些要点,不仅能够应对面试,更能为实际工作中的系统设计和技术选型提供坚实基础。延伸思考:如何设计一个支持百万QPS的缓存系统?这个问题的答案将涉及缓存分层、数据分片、连接优化、持久化策略等多个方面的综合考虑,这也是高级工程师面试的常见题目。

招风的黑耳优快云 1077

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【转】深入理解缓存穿透、缓存击穿和缓存雪崩

缓存穿透、缓存击穿和缓存雪崩是缓存系统中常见的三种问题,它们各自具有不同的特点、影响以及解决方案。以下是对这三种问题的深入理解以及相应的案例分析。

1821

深入理解浏览器的缓存机制之协商缓存与强缓存

浏览器缓存指的就是浏览器对之前请求过的文件进行缓存,以便在下一次访问时重复使用,从而节省带宽、提升访问速度、降低服务器压力。本文所说的HTTP缓存机制就是利用HTTP响应头将所请求的资源在浏览器中进行缓存,缓存方式主要分为两种:强缓存、协商缓存。

青春木鱼的博客 8568

深入理解缓存雪崩、缓存穿透与缓存击穿:原理、场景与应对策略

在现代高并发系统中,缓存层(如 Redis、Memcached)是架构中至关重要的一环。它能极大地缓解数据库压力,提升响应速度。然而,随着系统规模增大与流量复杂化,缓存系统本身也可能成为“性能黑洞”。在实际业务中,缓存雪崩、缓存穿透与缓存击穿是最常见的三大问题,它们不仅可能导致缓存命中率骤降,更严重时甚至会让数据库被瞬间压垮。本文将从底层机制、触发原因、案例剖析、以及解决方案多个维度深度分析这三种问题。缓存雪崩。

xinzhiyishi的博客 822

深入理解缓存访问倾斜与热点数据优化实战:两种高并发缓存应对方案解析

在大型电商系统中,缓存架构是确保系统性能与可用性的重要基石。今天我们重点来深入探讨一个常见但又极易被忽略的问题:缓存访问倾斜(也称缓存热点、流量倾斜),并基于这一问题讲解两个非常实用的应对策略:热门数据分片与缓存前置+本地缓存。

qq_46371374的博客 1243

深入理解缓存之缓存和数据库的一致性

GitHub:https://github.com/JDawnF 产生原因 主要有两种情况,会导致缓存和 DB 的一致性问题: 并发的场景下,导致读取老的 DB 数据,更新到缓存中。 缓存和 DB 的操作,不在一个事务中,可能只有一个操作成功,而另一个操作失败,导致不一致。 当然,有一点我们要注意,缓存和 DB 的一致性,我们指的更多的是最终一致性。我们使用缓存只要是提高读...

striveb的博客 3万+

深入理解浏览器缓存:强缓存与协商缓存

浏览器缓存机制详解:强缓存与协商缓存 摘要:浏览器缓存是前端性能优化的核心技术,通过本地存储资源减少重复请求,提升加载速度并降低服务器压力。缓存分为强缓存和协商缓存两种机制:强缓存通过Cache-Control/Expires响应头控制,直接复用本地资源无网络请求;协商缓存通过Last-Modified/ETag等头与服务器校验资源 freshness,返回304或新资源。文章详细解析了两类缓存的实现原理、HTTP头配置规则,并提供了Nginx和Node.js的实践示例,帮助开发者合理配置缓存策略,平衡性能

前端圈边缘选手,擅长把 UI 稿 “翻译” 成代码,也擅长在 console.log 里写 “求救信号”。日常状态:要么在调像素级对齐,要么在查 “为什么这个样式只在我电脑上生效”。博客不搞高深理论,只唠实在干货~ 3214

深入理解前端缓存

前端缓存是所有前端程序员在成长历程中必须要面临的问题,它会让我们的项目得到非常大的优化提升,同样也会带来一些其它方面的困扰。等,但是我相信大部分的前端程序员不了解它们的缓存机制。接下来我将带你们深入理解缓存的机制以及缓存时间的判断公式,如何合理的使用缓存机制来更好的提升优化。我将会把前端缓存分成HTTP缓存和浏览器缓存两个部分来和大家一起聊聊。

量子前端的博客 1805

面试官:熟悉Redis?请讲讲Redis缓存穿透、缓存击穿、缓存雪崩有什么区别

key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会压到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。在某一时刻,突然有大量的请求去请求应用服务器,一般情况下,应用服务器会去Redis查询缓存数据,查到则返回数据,查不到,则去数据库差数据。

我这么骄傲的一个人。 1517

深入理解 Spring 的三重缓存机制

三重缓存是 Spring 在加载 Bean 时用来优化性能的一种设计模式,它利用了三级缓存来确保 Bean 在多线程环境下的安全初始化,避免了循环依赖问题,提升了性能。

qdsd_1898的博客 2414
上一篇: 深入理解缓存之常见的缓存算法
下一篇: 深入理解缓存之缓存和数据库的一致性
striveb
博客等级 码龄10年 242粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值