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

news2025/6/4 17:41:55

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

缓存问题有哪些?

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

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.coloradmin.cn/o/2396468.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GC1267F:单相全波风扇电机预驱动芯片解析

在现代电子设备中,风扇电机的驱动控制是散热系统的关键组成部分。GC1267F 是一款由浙江新麦科技有限公司生产的单相全波风扇电机预驱动芯片,适用于需要大风量和大电流的服务器以及消费类电器风扇电机驱动。 芯片特性 GC1267F 支持外部 PWM 信号的变速功…

Linux --进程状态

目录 进程状态(宏观) Linux进程状态 进程状态的查看 进程状态(宏观) 为了了解Linux的进程状态,首先我们得了解进程状态,因为不仅仅是在Linux下有进程状态,macos和windows下都有进程状态,这里先解释的是一个宏观概念下的&#xff…

智能手机上用Termux安装php+Nginx

Termux的官方网站:Termux | The main termux site and help pages. 以下是在 Termux 上安装和配置 PHP Nginx 的完整流程总结,包含关键步骤和命令: 一、安装依赖 pkg update && pkg upgrade # 更新包列表和系统pkg install nginx p…

Visual Studio 调试中 PDB 与图像不匹配

Visual Studio 调试中 PDB 与图像不匹配 在使用 Visual Studio 进行本地或远程调试时,很多开发者会遇到 PDB 加载失败、符号不匹配的问题,甚至程序进程未退出,导致 .exe 文件无法成功覆盖。本文详细解析了从后台进程清理、构建产物验证、模块…

设计模式——策略设计模式(行为型)

摘要 策略设计模式是一种行为型设计模式,它定义了一系列算法并将每个算法封装起来,使它们可以相互替换。该模式让算法的变化独立于使用算法的客户,从而使得算法可以灵活地切换和扩展。其主要角色包括策略接口、具体策略类和环境类。策略模式…

保持本地 Git 项目副本与远程仓库完全同步

核心目标: 保持本地 Git 项目副本与 GitHub 远程仓库完全同步。 关键方法: 定期执行 git pull 命令。 操作步骤: 进入项目目录: 在终端/命令行中,使用 cd 命令切换到你的项目文件夹。执行拉取命令: 运行…

设计模式——模版方法设计模式(行为型)

摘要 模版方法设计模式是一种行为型设计模式,定义了算法的步骤顺序和整体结构,将某些步骤的具体实现延迟到子类中。它通过抽象类定义模板方法,子类实现抽象步骤,实现代码复用和算法流程控制。该模式适用于有固定流程但部分步骤可…

Deepin 20.9社区版安装Docker

个人博客地址:Deepin 20.9社区版安装Docker | 一张假钞的真实世界 注意事项 Deepin 20.9 社区版安装 Docker 需要注意两点: 因为某些原因,Docker 官方源基本不可用,所以需要使用镜像源进行安装。当然也可以用安装包直接安装&am…

纯数据挖掘也能发Microbiome?

抗生素滥用导致多重耐药微生物在全球蔓延,但新型抗生素的研发进展缓慢,亟需找到替代抗生素的新型防御策略。抗菌肽(AMPs)作为天然防御分子,具有低耐药潜力和广谱活性。德国小蠊(Blattella germanica&#x…

2025年05月30日Github流行趋势

项目名称:agenticSeek 项目地址url:https://github.com/Fosowl/agenticSeek项目语言:Python历史star数:13040今日star数:1864项目维护者:Fosowl, steveh8758, klimentij, ganeshnikhil, apps/copilot-pull-…

跨平台猫咪桌宠 BongoCat v0.4.0 绿色版

—————【下 载 地 址】——————— 【​本章下载一】:https://pan.xunlei.com/s/VORWH1a7lPhdwvon6DJgKvrNA1?pwdcw2h# 【​本章下载二】:https://pan.quark.cn/s/c3ac86f4e296 【百款黑科技】:https://ucnygalh6wle.feishu.cn/wiki/…

Dify案例实战之智能体应用构建(一)

一、部署dify Windows安装Docker部署dify,接入阿里云api-key进行rag测试-CSDN博客 可以参考我的前面文章,创建一个本地dify或者直接dify官网使用一样的(dify官网需要科学上网) 二、Dify案例实战之智能体 2.1 智能面试官 需求;…

从模式到架构:Java 工厂模式的设计哲学与工程化实践

一、工厂模式概述 (一)定义与核心思想 工厂模式(Factory Pattern)是软件开发中常用的创建型设计模式,其核心思想是将对象的创建过程封装起来,通过工厂类来统一管理对象的创建逻辑。这种模式分离了对象的创…

docker问题记录

docker pull镜像: 即使配置了镜像源也还是走的国外的镜像源: 解决办法:在pull镜像的时候强制走自己的镜像 比如:拉取rabbitmq,强制使用"https://docker.m.daocloud.io"这个镜像 docker pull docker.m.da…

设计模式——代理设计模式(结构型)

摘要 本文详细介绍了代理设计模式,包括其定义、结构组成、实现方式、适用场景及实战示例。代理设计模式是一种结构型设计模式,通过代理对象控制对目标对象的访问,可增强功能或延迟加载等。文中通过类图、时序图、静态代理、JDK动态代理、CGL…

从“固定“到“流动“:移动充电如何重塑用户体验?

在传统充电模式中,"固定"不仅是技术的特征,更成为用户行为的枷锁——人们需要规划行程、寻找插座、等待电量填满,这种被动适配正在被移动充电技术颠覆。当充电设备从墙面解放,化身可携带的能源胶囊,甚至嵌入…

玩客云 OEC/OECT 笔记(1) 拆机刷入Armbian固件

目录 玩客云 OEC/OECT 笔记(1) 拆机刷入Armbian固件玩客云 OEC/OECT 笔记(2) 运行RKNN程序 外观 内部 PCB正面 PCB背面 PCB背面 RK3566 1Gbps PHY 配置 OEC 和 OECT(OEC-turbo) 都是基于瑞芯微 RK3566/RK3568 的网络盒子, 没有HDMI输入输出. 硬件上 OEC 和 OECT…

GIS数据类型综合解析

GIS数据类型综合解析 目录 GIS数据类型综合解析1. 总体介绍2. GIS数据类型分类与对比2.1 主要数据类型对比表 3. 详细解析与扩展内容3.1 矢量数据(Vector Data)3.2 栅格数据(Raster Data)3.3 属性数据(Attribute Data&…

Prometheus + Grafana 监控常用服务

一、引言 Prometheus监控常见服务的原理主要包括服务暴露指标和Prometheus抓取指标。一方面,被监控服务通过自身提供的监控接口或借助Exporter将服务的性能指标等数据以HTTP协议的方式暴露出来;另一方面,Prometheus根据配置好的采集任务&…

6月1日星期日今日早报简报微语报早读

6月1日星期日,农历五月初六,早报#微语早读。 1、10个省份城镇化率超70%,广东城镇人口超9700万; 2、长沙居民起诉太平财险不赔“新冠险”,立案878天后获胜判; 3、海口:全市范围内禁止投放互联…