经典面试题:一文了解常见的缓存问题

article/2025/8/12 14:43:48

在面试过程中,面试官的桌子上摆放着很多高频的面试题,能否顺利回答决定了你面试通过的概率。其中缓存问题就是其中的一份,可以说掌握缓存问题及解决方法是面试前必须准备的内容。那么缓存有什么典型的问题,出现的原因是什么,又该如何解决呢?本文,来为你一一详细介绍。

缓存问题有哪些?

缓存虽然能提升性能,但也会带来一些问题。缓存问题有很多,其中经典的缓存问题如下图所示:

1. 缓存雪崩

问题描述

缓存服务宕机,导致所有请求直接访问数据库,引发数据库压力激增甚至崩溃。

解决方法

  • 集群化部署缓存(如Redis Cluster),实现高可用;
  • 使用熔断降级机制,限制数据库访问量;
  • 读写分离;
  • 使用本地缓存;
  • 对缓存体系进行实时监控, 当请求访问的慢速比超过阀值时,及时报警,通过机器替换、服务替换进行及时恢复;也可以通过各种自动故障转移策略,自动关闭异常接口、停止边缘服务、停止部分非核心功能措施,确保在极端场景下,核心功能的正常运行。

2. 缓存失效

问题描述

大量缓存数据同时过期,导致所有请求直接访问数据库,引发数据库压力激增甚至崩溃。

解决方法

  • 设置随机过期时间,避免同时失效。使用公式:过期时间 = base 时间 + 随机时间

3. 缓存穿透

问题描述

频繁查询不存在的数据(如恶意攻击),缓存和数据库均无法命中,导致无效请求穿透到数据库。

解决方法

  • 布隆过滤器(Bloom Filter): 构建一个 BloomFilter 缓存过滤器,记录全量数据,这样访问数据时,可以直接通过 BloomFilter 判断这个 key 是否存在,如果不存在直接返回即可,根本无需查缓存和 DB。但是BloomFilter 要缓存全量的 key,这就要求全量的 key 数量不大,10亿条数据以内最佳,因为 10亿 条数据大概要占用 1.2GB 的内存。也可以用 BloomFilter 缓存非法 key,每次发现一个 key 是不存在的非法 key,就记录到 BloomFilter 中,这种记录方案,会导致 BloomFilter 存储的 key 持续高速增长,为了避免记录 key 太多而导致误判率增大,需要定期清零处理;
  • 缓存空值(Null Object): 为不存在的 Key 设置短时间缓存,避免重复查询数据库。

4. 缓存击穿

问题描述

某个热点Key突然过期,大量并发请求直接访问数据库,导致瞬时压力过大。

解决方法

  • 永久缓存: 针对基本不会发生更新的场景,可以把 key 设置为永不过期,让 key 常驻缓存;
    **定期缓存:针对需要频繁更新的场景,**可以使用额外的补偿程序来定时刷新缓存或者延长 key 的实效时间;
  • 分布式锁: 针对偶尔需要更新的场景,可以对请求代码使用分布式互斥锁,使得少部分直接请求数据库后更新缓存,而剩余的其他请求直接使用新缓存即可,或者采用本地互斥锁保证仅有少量请求能够更新缓存,其余请求访问新缓存。

5. 缓存与数据库一致性

问题描述

缓存与数据库数据不一致,常见于更新操作时,比如更新 DB 后,写缓存失败,从而导致缓存中存的是老数据。

解决方式

  • 删除 Key: 写入/更新的时候,先删除缓存中的 Key,再更新数据库;
  • 订阅数据库Binlog: 通过监听数据库变更同步更新缓存(如Canal工具);
  • 最终一致性容忍: 根据业务场景接受短暂不一致。

6. 缓存预热

问题描述

系统启动时缓存为空,大量请求直接访问数据库导致冷启动压力。

解决方式

  • 提前加载热点数据到缓存(如统计分析高频访问的Key)。

7. 缓存淘汰策略

问题描述

缓存空间有限时,如何选择淘汰哪些数据以腾出空间。

解决方式

  • LRU(Least Recently Used): 淘汰最近最少使用的数据;
  • LFU(Least Frequently Used): 淘汰访问频率最低的数据;
  • TTL(Time To Live):基于过期时间淘汰。

8. 缓存污染

问题描述

缓存中存储了低频访问的数据,挤占了热点数据的空间。

解决方式

  • 优化缓存淘汰策略(如结合LRU和LFU);
  • 定期清理非热点数据。

9. 热点 Key

问题描述

某些业务在某一瞬间或某一时间段内可能会成为热点业务,热点业务的数据可能会产生热点key,比如微博上热榜数据。

解决方式

  • 找到对应的热点 key,将这些热 key 进行分散处理,比如一个热 key 名字叫 hotkey,可以被分散为 hotkey#1、hotkey#2、hotkey#3,……hotkey#n,这 n 个 key 分散存在多个缓存节点,然后 client 端请求时,随机访问其中某个后缀的 hotkey,这样就可以把热 key 的请求打散,避免一个缓存节点过载;
  • 也可以 key 的名字不变,对缓存提前进行多副本+多级结合的缓存架构设计。再次,如果热 key 较多,还可以通过监控体系对缓存的 SLA 实时监控,通过快速扩容来减少热 key 的冲击。最后,业务端还可以使用本地缓存,将这些热 key 记录在本地缓存,来减少对远程缓存的冲击。

10. 大 Key

问题描述

缓存中某些 key 的 value 的值过大,导致写操作超时、加载速度缓慢等问题。

解决方式

  • 如果数据存在 MC 中,可以设计一个缓存阀值,当 value 的长度超过阀值,则对内容启用压缩,让 KV 尽量保持小的 size,其次评估大 key 所占的比例,在 Mc 启动之初,就立即预写足够数据的大 key,让 MC 预先分配足够多的 trunk size 较大的 slab。确保后面系统运行时,大 key 有足够的空间来进行缓存;
  • 如果数据存在 Redis 中,比如业务数据存 set 格式,大 key 对应的 set 结构有几千几万个元素,这种写入 Redis 时会消耗很长的时间,导致 Redis 卡顿。此时,可以扩展新的数据结构,同时让 client 在这些大 key 写缓存之前,进行序列化构建,然后通过 restore 一次性写入;
  • 将大 key 分拆为多个 key,尽量减少大 key 的存在。同时由于大 key 一旦穿透到 DB,加载耗时很大,所以可以对这些大 key 进行特殊照顾,比如设置较长的过期时间,比如缓存内部在淘汰 key 时,同等条件下,尽量不淘汰这些大 key。

http://www.hkcw.cn/article/SKhlEVrkKH.shtml

相关文章

Python Turtle实战:打造高精度图形化秒表

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…

Python实现P-PSO优化算法优化卷积神经网络CNN回归模型项目实战

说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 随着人工智能和深度学习技术的快速发展,卷积神经网络(CNN)在图像分类、目标检测…

OVD开放词汇检测 Detic 训练COCO数据集实践

0、引言 纯视觉检测当前研究基本比较饱和,继续创新提升空间很小,除非在CNN和transformer上提出更强基础建模方式。和文本结合是当前的一大趋势,也是计算机视觉和自然语言处理结合的未来趋势,目前和文本结合的目标检测工作还是有很…

leetcode0404. 左叶子之和-easy

1 题目:左叶子之和 官方标定难度:易 给定二叉树的根节点 root ,返回所有左叶子之和。 示例 1: 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15&#…

PINNs案例——二维磁场计算

基于物理信息的神经网络是一种解决偏微分方程计算问题的全新方法… 有关PINN基础详见:PINNs案例——中心热源温度场预测问题的torch代码 今日分享代码案例:二维带电流源磁场计算 该案例参考学习论文:[1]张宇娇,孙宏达&#xff0…

历年西安邮电大学计算机保研上机真题

历年西安邮电大学计算机保研上机真题 2025西安邮电大学计算机保研上机真题 2024西安邮电大学计算机保研上机真题 2023西安邮电大学计算机保研上机真题 在线测评链接:https://pgcode.cn/school 狗剩游泳 题目描述 酷暑难耐,好消息传来,毛…

【算法题】算法一本通

每周更新至完结,建议关注收藏点赞。 目录 待整理文章已整理的文章方法论数组与哈希表栈双指针(滑动窗口、二分查找、链表)树前缀树堆 优先队列(区间/间隔问题、贪心 )回溯图一维DP位操作数学与几何学二维DP随缘更新&a…

Spring如何实现组件扫描与@Component注解原理

Spring如何实现组件扫描与Component注解原理 注解配置与包扫描的实现机制一、概述:什么是注解配置与包扫描?二、处理流程概览三、注解定义ComponentScope 四、核心代码结构1. ClassPathScanningCandidateComponentProvider2. ClassPathBeanDefinitionSca…

NLP学习路线图(十六):N-gram模型

一、为何需要语言模型?概率视角下的语言本质 自然语言处理的核心挑战在于让机器“理解”人类语言。这种理解的一个关键方面是处理语言的歧义性、创造性和结构性。语言模型(Language Model, LM)为此提供了一种强大的数学框架:它赋…

使用ReactNative加载HarmonyOS Svga动画

这是一款使用ReactNative 加载HarmonyOS Svga动画的播放器插件 三端Svga动画统一使用点击这里 版本:v1.1.2 react-native-ohos-svgaplayer [!TIP] Github 地址 安装与使用 npm npm install react-native-ohos-svgaplayer yarn yarn add react-native-ohos-svgaplayer下面…

电路图识图基础知识-高、低压供配电系统一次系统识图(十一)

1、高、低压供配电 一 次系统的介绍 供配电系统中输送、分配和使用电能的电路,称为一次电路或一次回路,也称为一次系统或主接线。控制、指示、测量和保护一次电路及其中设备运行的电路,称为二次电路或二次回路.也称为二次系统。 工厂供配电系…

read-bridge开源程序是AI 增强阅读工具,使用 n+1 方法进行沉浸式语言学习。通过留在目标语言生态系统中学习语言,具有以流状态为中心的界面。

​一、软件介绍 文末提供程序和源码下载 read-bridge开源程序是AI 增强阅读工具,使用 n1 方法进行沉浸式语言学习。通过留在目标语言生态系统中学习语言,具有以流状态为中心的界面。 二、Overview 概述 此阅读助手支持源到源语言学习方法,减…

调教 DeepSeek - 输出精致的 HTML MARKDOWN

【序言】 不知道是不是我闲的蛋疼,对百度AI 和 DeepSeek 的回答都不太满意。 DeepSeek 回答句子的引用链接,始终无法准确定位。有时链接只是一个域名,有时它给的链接是搜索串如: baidu.com/?q"搜索内容"。 百度AI 回答句子的引用…

【论文阅读 | PR 2024 |ICAFusion:迭代交叉注意力引导的多光谱目标检测特征融合】

论文阅读 | PR 2024 |ICAFusion:迭代交叉注意力引导的多光谱目标检测特征融合 1.摘要&&引言2.方法2.1 架构2.2 双模态特征融合(DMFF)2.2.1 跨模态特征增强(CFE)2.2.2 空间特征压缩(SFS)…

本振相参解析(1)2025.6.1

前言 本振相参是射频与通信系统中的关键技术概念,涉及本机振荡器(LO)信号的相位稳定性和多信号间的相干性控制。以下从定义、关键技术、应用场景及挑战等方面展开分析: 一、核心概念解析 本振(Local Oscillator, LO…

一个完整的日志收集方案:Elasticsearch + Logstash + Kibana+Filebeat (一)

整体链路 [应用服务器] --> [Filebeat] --> [Logstash] --> [Elasticsearch] --> [Kibana] 组件职责 Kibana: 可视化和分析日志数据Elasticsearch: 存储和索引日志数据Logstash: 解析、转换和丰富日志数据Filebeat&#xff1a…

Notepad++找回自动暂存的文件

场景: 当你没有保存就退出Notepad,下次进来Notepad会自动把你上次编辑的内容显示出来,以便你继续编辑。除非你手动关掉当前页面,这样Notepad就会删除掉自动保存的内容。 问题: Notepad会将自动保存的文件地址,打开Note…

VMware-VMRC-12.0.1-18113358安装包下载安装与使用(附下载)

文章目录 简介1、下载地址2、安装使用总结 简介 VMware-VMRC(VMware Virtual Machine Remote Console) 是 VMware 提供的一款远程控制台工具,用于连接和管理 VMware 虚拟化环境中的虚拟机(VM)。它允许用户通过图形界面…

车载诊断框架 ---CAN诊断多帧传输时间参数记忆口诀

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

docker、ctr、crictl命令简介与使用

概述 在使用k3s过程中,经常需要使用ctr和crictl两个命令,本文记录一下。 ctr 类似docker命令是docker-shim容器运行时的客户端工具,ctr是Containerd的客户端工具。一个简单的CLI接口,用作Containerd本身的一些调试用途&#xf…