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

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

缓存问题有哪些?

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

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.pswp.cn/diannao/85655.shtml

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

相关文章

生产环境中安装和配置 Nginx 以部署 Flask 应用的详细指南

在生产环境中部署 Flask 应用时,Nginx 常被用作反向代理服务器,与 WSGI 服务器(如 Gunicorn)协同工作。Nginx 可以处理静态文件、提供 SSL/TLS 加密、实现负载均衡等功能。本文将详细介绍如何在 Ubuntu/Debian 系统上安装 Nginx&a…

鸿蒙进阶——Mindspore Lite AI框架源码解读之模型加载详解(一)

文章大纲 引言一、模型加载概述二、核心数据结构三、模型加载核心流程 引言 Mindspore 是一款华为开发开源的AI推理框架,而Mindspore Lite则是华为为了适配在移动终端设备上运行专门定制的版本,使得我们可以在OpenHarmony快速实现模型加载和推理等功能&…

AI炼丹日志-24 - MCP 自动操作 提高模型上下文能力 Cursor + Sequential Thinking Server Memory

点一下关注吧!!!非常感谢!!持续更新!!! Java篇: MyBatis 更新完毕目前开始更新 Spring,一起深入浅出! 大数据篇 300: Hadoop&…

【仿muduo库实现并发服务器】实现时间轮定时器

实现时间轮定时器 1.时间轮定时器原理2.项目中实现目的3.实现功能3.1构造定时任务类3.2构造时间轮定时器每秒钟往后移动添加定时任务刷新定时任务取消定时任务 4.完整代码 1.时间轮定时器原理 时间轮定时器的原理类似于时钟,比如现在12点,定一个3点的闹…

Windows10下搭建sftp服务器(附:详细搭建过程、CMD连接测试、连接失败问题分析解决等)

最终连接sftp效果 搭建sftp服务器 1、这里附上作者已找好的 freeSSHd安装包 ,使用它进行搭建sftp服务器。 2、打开freeSSHd安装包,进行安装 (1)、选择完全安装 (2)、安装完成后,对提示窗口选择关闭 (3)、安装完成后,提示是否安装私有密钥。我们选择"是" (4)、安…

推荐几个不错的AI入门学习视频

引言:昨天推荐了几本AI入门书(AI入门书),反响还不错。今天,我再推荐几个不错的AI学习视频,希望对大家有帮助。 网上关于AI的学习视频特别多。有收费的,也有免费的。我今天只推荐免费的。 我们按…

点击启动「高效模式」:大腾智能 CAD 重构研发设计生产力

在制造业数字化转型浪潮中,设计工具的革新正成为企业突破效率瓶颈的关键。传统CAD软件因本地硬件依赖、协作壁垒高筑、复杂场景响应迟缓等问题,长期困扰设计团队。 大腾智能CAD依托华为云底座、自研几何引擎及AI技术深度融合,为制造行业各细…

cursor如何开启自动运行模式

在Cursor中,开启自动运行模式即启用“Yolo Mode”,具体操作如下: 按下Ctrl Shift J(Windows/Linux)或Cmd Shift J(Mac)打开Cursor设置。导航到“Features”(功能)选…

Windows10-ltsc-2019 使用 PowerShell 安装安装TranslucentTB教程(不通过微软商店安装)

Windows10-ltsc-2019 使用 PowerShell 安装安装TranslucentTB教程(不通过微软商店安装) 下载 v2020.4(最后一个兼容 1809 的版本): TranslucentTB安装包(下载不了上面有安装包)安装依赖项(如未安装&#x…

分布式拜占庭容错算法——实现工作量证明(PoW)算法详解

Java 实现工作量证明(PoW)算法详解 一、PoW 核心原理 #mermaid-svg-AAj0Pvst1PVcVy5v {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-AAj0Pvst1PVcVy5v .error-icon{fill:#552222;}#mermaid…

黑马Java面试笔记之框架篇(Spring、SpringMvc、Springboot)

一. 单例bean Spring框架中的单例bean是线程安全的吗? Spring框架中的bean是单例的,可以在注解Scope()进行设置 singleton:bean在每一个Spring IOC容器中只有一个实例。prototype:一个bean的定义可以有多个实例 总结 二. AOP AOP称…

electron下载文件

const http require(http); const https require(https); const fs require(fs); const { URL } require(url); const path require(path);// 下载文件函数 function downloadFile(url, savePath) {return new Promise((resolve, reject) > {try {console.log(开始下载…

快速掌握 GO 之 RabbitMQ 结合 gin+gorm 案例

更多个人笔记见: (注意点击“继续”,而不是“发现新项目”) github个人笔记仓库 https://github.com/ZHLOVEYY/IT_note gitee 个人笔记仓库 https://gitee.com/harryhack/it_note 个人学习,学习过程中还会不断补充&…

android FragmentManager 删除所有Fragment 重建

在Android开发中,管理Fragment是一项常见任务,有时需要删除所有Fragment并重新创建。这在某些场景下,例如用户需要重置应用状态或切换内容时,显得尤为重要。本文将详细介绍如何通过 FragmentManager删除所有Fragment并重建。 一、…

ubuntu之开机自启frpc

在 Ubuntu 系统中为 frpc 设置开机自启(以 frpc -c frpc.toml 命令为例),可以通过 systemd 服务实现。以下是详细步骤: 创建 systemd 服务文件 sudo vim /etc/systemd/system/frpc.service 写入以下内容(根据你的路…

推荐一款PDF压缩的工具

今天一位小伙伴找来,问我有没有办法将PDF变小的办法。 详细了解了一下使用场景: 小伙伴要在某系统上传一个PDF文件,原文件是11.6MB,但是上传时系统做了限制,只能上传小于10MB的文件,如图: 我听…

JDK21深度解密 Day 11:云原生环境中的JDK21应用

【JDK21深度解密 Day 111】云原生环境中的JDK21应用 本文是《JDK21深度解密:从新特性到生产实践的全栈指南》专栏的第11天内容,聚焦云原生环境中的JDK21应用。我们将深入探讨如何在容器化、微服务、Serverless等云原生架构中充分发挥JDK21的技术优势,提升Java应用的性能、稳…

Java-redis实现限时在线秒杀功能

1.使用redisson pom文件添加redisson <!--redisson--><dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.23.4</version></dependency> 2.mysql数据库表设…

QT- QML Layout+anchors 布局+锚点实现窗口部件权重比例分配

布局管理 简单比较两种界面管理锚点布局实现比例布局布局管理实现比例布局循环依赖问题简谈 在日常打螺丝中&#xff0c;我们偶尔会需要实现界面各组件能按比例放置&#xff0c;自适应各种分辨率的需求。我用锚点和布局都实现过相关界面&#xff0c;记录下来两种方式实现的差异…

Java项目OOM排查

排查思路 Java项目出现OOM&#xff08;Out Of Memory&#xff0c;内存溢出&#xff09;问题时&#xff0c;排查思路如下&#xff1a; 确认OOM类型&#xff1a; Java Heap Space&#xff1a;堆内存溢出&#xff0c;通常是对象创建过多或内存泄漏。PermGen Space&#xff1a;永久…