【PmHub面试篇】PmHub 缓存与数据库一致性的面试专题分析

在分布式系统开发中,缓存与数据库的一致性问题是后端开发面试的核心考点之一。本文结合 PmHub 项目实践,整理高频面试题及深度解答,帮助开发者系统掌握缓存一致性解决方案的设计与实现。若想对相关内容有更透彻的理解,强烈推荐参考之前发布的博文:【PmHub后端篇】PmHub 中缓存与数据库一致性的实现方案及分析

1 项目中如何保证缓存和数据一致性

我们主要采用Cache Aside 模式,核心逻辑是:

  • 读流程
    • 先查询缓存,若命中直接返回
    • 若未命中,查询数据库
    • 将查询结果写入缓存(设置合理过期时间)
  • 写流程:
    • 先更新数据库
    • 删除对应缓存(而非更新,原因见问题 2)

同时结合以下辅助策略:

  • 分布式锁:处理高并发写冲突(如流程状态更新场景,通过 Redisson 实现分布式锁)
  • 缓存监控:通过 SkyWalking 监控缓存命中率(目标 > 90%)、淘汰率(<5%)
  • 定时任务:每日凌晨对冷数据进行全量缓存重建

2 为什么删除缓存,而不更新缓存

主要基于以下考量:

  • 更新缓存浪费服务器资源:频繁的缓存更新可能导致缓存服务器的负载增加,通过删除缓存而不是频繁更新,可以减少缓存服务器的压力,提高系统整体性能。
  • 避免脏数据:高并发下更新缓存可能读到中间态数据(如事务未提交)
  • 减少无效更新:频繁写场景下,删除缓存可避免缓存与 DB 的无效同步

3 先更新 DB,再删除缓存是否是完美解决方案

  • 局限性分析
    1. 写性能损耗:每次写操作需额外执行缓存删除(优化方向:通过异步队列批量处理缓存失效)

    2. 极端并发不一致
      场景:线程 A 更新 DB 后未删缓存时,线程 B 读取到旧缓存
      概率:仅发生在 DB 更新成功但缓存删除失败,且此时有读请求的极端情况
      解决方案

      • 缓存设置短过期时间(如 5 分钟)
      • 增加异步校验任务(定时对比 DB 与缓存数据)
    3. 缓存穿透与预热问题

    • 冷数据首次访问会穿透到 DB(布隆过滤器拦截无效请求)
    • 系统冷启动时需预热热点数据(启动时通过 Spring 事件监听异步加载)

4 Cache Aside 模式有哪些局限性?

  • 缓存穿透:首次访问冷数据时存在 DB 穿透风险(解决方案:布隆过滤器拦截无效 key)
  • 并发不一致:极端情况下(如更新 DB 后删除缓存前服务宕机)可能不一致(解决方案:分布式锁 + 异步数据校验任务)
  • 缓存预热:冷启动时需要预热热点数据(解决方案:启动时通过 @PostConstruct 预热或异步线程加载)
  • 写性能影响:每次写操作需额外执行缓存删除(优化方向:合并批量写操作,使用 Redis Pipeline 批量删除)

5 Spring Cache 如何集成 Redis?

Spring Cache 默认使用本地缓存(ConcurrentMap),集成 Redis 需:

  1. 添加 Redis 缓存依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 配置 CacheManager:
@Bean
public RedisCacheManagerBuilderCustomizer redisCacheManagerBuilderCustomizer(RedisConnectionFactory connectionFactory) {return builder -> builder.cacheDefaults(RedisCacheConfiguration.defaultCacheConfig(connectionFactory)).withCacheConfiguration("yourCacheName", RedisCacheConfiguration.defaultCacheConfig(connectionFactory).entryTtl(Duration.ofMinutes(5)));
}
  1. 使用 @Cacheable/@CacheEvict 注解声明缓存操作。

6 如果缓存删除失败怎么办?

采用重试机制 + 消息队列

  • 删除缓存失败时,将 key 写入 RabbitMQ 死信队列
  • 通过消费者异步重试删除(设置 3 次重试间隔,避免洪峰)

7 如何处理缓存雪崩?

  • 缓存层加随机过期时间(如 10-15 分钟随机)
  • 对热点数据加本地缓存(Caffeine)作为保护罩
  • 服务层添加 Hystrix 熔断,防止 DB 被压垮

6 参考链接

PmHub如何保证缓存和数据库的一致性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/910119.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/910119.shtml

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

相关文章

游戏行业对于服务器类型该怎样进行选择

大型的网络游戏和多人在线游戏对于服务器类型的选择还是有着一定要求的&#xff0c;在游戏运行的过程中一般需要处理大量的数据&#xff0c;如玩家的实时操作和游戏场景渲染等多种内容&#xff0c;较为热门的在线游戏&#xff0c;在线玩家数量会非常庞大&#xff0c;这需要服务…

Android Studio安装遇到的问题

一、现况 1.1 安装时间 2025-06 1.2由于本人操作系统是win7的&#xff0c;android studio最新版支持的最低要求官方是win11,16G&#xff0c;所以我下载的是android studio的版本&#xff0c;版本信息android-studio-2024.1.2.12-windows jdk用的是1.8&#xff0c; gradle用的…

[论文阅读] 人工智能 + 软件工程 | 用大语言模型架起软件需求形式化的桥梁

用大语言模型架起软件需求形式化的桥梁 论文信息 misc{beg2025short,title{A Short Survey on Formalising Software Requirements with Large Language Models}, author{Arshad Beg and Diarmuid ODonoghue and Rosemary Monahan},year{2025},eprint{2506.11874},archivePre…

0_1面向对象

基本套路 题目描述 往往非常简单,如:设计一个XX系统。或者:你有没有用过XXX,给你看一下它的界面和功能,你来设计一个。阐述题意 面试者需向面试官询问系统的具体要求。如,需要什么功能,需要承受的流量大小,是否需要考虑可靠性,容错性等等。面试者提供一个初步的系统设…

mumu模拟器鼠标侧键返回

把图片中的“点击鼠标右键“操作换成点侧键 参考文章&#xff1a;你们要的鼠标右键返回来啦【mumu模拟器吧】_百度贴吧

软件公司进军无人机领域的战略指南与生态合作全景-优雅草卓伊凡

软件公司进军无人机领域的战略指南与生态合作全景-优雅草卓伊凡 那么找到细分领域我们应该如何开始真正加入无人机开发的梯队呢&#xff0c;卓伊凡看了大疆创新加入成为认证开发者也是非常不错的选择。 引言&#xff1a;无人机产业的黄金机遇 根据德勤2023年全球无人机解决方…

键盘觉醒:Raycast 把 Mac 变成「AI 指令战舰」

在 Mac 上追逐效率的脚步&#xff0c;从未停歇。从早期的 Alfred 到系统内置的 Spotlight&#xff0c;这些工具虽好用&#xff0c;却总让人觉得功能边界清晰&#xff0c;变化有限。直到 Raycast 出现&#xff0c;彻底重塑了这个品类的想象空间。它集启动应用、查找文件、单位换…

宇宙尽头是WPS之——【Excel】一个自动重新排序的宏

1. 目的 你是否在做一个表格排序&#xff0c;但只能知道某几个行之间的相对顺序&#xff0c;而可能排着排着发现后面还有顺序更靠前的项&#xff0c;而不得不将排好的序号重新11…… 所以你需要一个宏&#xff0c;它可以知道你输入了一个已经存在的序号&#xff0c;并以那个序…

Sharding-jdbc使用(一:水平分表)

说明&#xff1a;Sharding-jdbc是常见的分库分表工具&#xff0c;本文介绍Sharding-jdbc的基础使用。 分库分表 首先&#xff0c;介绍一下分库分表&#xff1a; &#xff08;1&#xff09;分库 水平分库&#xff1a;以字段为依据&#xff0c;按照一定策略&#xff08;hash、…

处理器指令中的函数调用指令是什么?

处理器指令中的函数调用指令是什么? 函数调用指令是处理器指令集中用于实现函数(或子程序)调用和返回的专用指令。它们是支持结构化编程和代码复用的硬件基础。核心指令通常包括: 调用指令 (CALL / BL / BLX 等): 功能: 暂停当前函数的执行,跳转到目标函数(被调用函数)…

CHASE、CoSQL、SPARC概念介绍

CHASE&#xff1a;一个跨领域多轮交互text2sql中文数据集&#xff0c;包含5459个多轮问题组成的列表&#xff0c;一共17,940个<query, SQL>二元组&#xff0c;涉及280个不同领域的数据库。CoSQL&#xff1a;一个用于构建跨域对话文本到sql系统的语料库。它是Spider和SPar…

设备巡检系统小程序ThinkPHP+UniApp

基于ThinkPHP和Uniapp开发的设备巡检系统&#xff0c;可应用于电力、水利、物业等巡检场景&#xff0c;可编译微信小程序。提供全部无加密源码&#xff0c;可私有化部署。 ​功能特性 部门管理 后台可以设置多部门&#xff0c;便于筛选员工 员工管理 后台维护员工信…

Visual Studio Code 1.101下载

[软件名称]: Visual Studio Code 1.101 [软件大小]: 147 MB [下载通道]: 夸克盘 | 迅雷盘 | 百度盘 &#x1f3af; 一、MCP&#xff08;Model Context Protocol&#xff09;全面升级 资源 Templates 支持 MCP 现在不仅能处理提示&#xff0c;还能识别和管理“资源模板”&…

linux的基本运维

grep 选项功能-r递归搜索子目录-i忽略大小写-n显示行号-l只显示文件名-v反转匹配&#xff08;显示不包含的行&#xff09;-w全词匹配-E使用扩展正则表达式–include指定文件类型 --include*.{js,py}–exclude排除文件类型 --exclude*.log–exclude-dir排除目录 --exclude-dir{…

c++11右值引用(rvalue reference)

右值引用&#xff08;rvalue reference&#xff09;是 C11 引入的一个新特性&#xff0c;主要用于支持移动语义&#xff0c;优化资源的管理&#xff0c;尤其是在进行资源转移时避免不必要的拷贝操作。右值引用通过 && 符号进行表示。 1. 右值引用的基本概念 右值&…

【算力网络】算网安全

一、算网安全概念 算力网络与网络空间安全的结合设计需构建“内生安全、智能调度、动态防护”的一体化体系&#xff0c;而SRv6安全服务链正是实现该目标的核心技术路径。 1.1、算力网络安全架构设计 1.1.1 体系化架构思路与方法体系 1. ​分层安全架构&#xff08;“三横一…

传输层协议UDP/TCP

目录 UDP协议 UDP协议段格式 UDP缓冲区 TCP协议 TCP协议段格式 确认应答机制 超时重传机制 连接管理机制 连接建立&#xff08;三次握手&#xff09; 连接关闭&#xff08;四次挥手&#xff09; 滑动窗口 流量控制 拥塞控制 延迟应答 捎带应答 UDP协议 UDP协议…

华为OD-2024年E卷-找终点[100分] -- python

问题描述&#xff1a; 给定一个正整数数组&#xff0c;设为nums&#xff0c;最大为100个成员&#xff0c;求从第一个成员开始&#xff0c;正好走到数组最后一个成员&#xff0c;所使用的最少步骤数。要求: 第一步必须从第一元素开始&#xff0c;且1<第一步的步长<len/2…

ARINC653分区调度算法的研究与改进

# ARINC653分区调度算法的研究与优化&#xff1a;从单核到多核的实时性保障 ## 1 研究背景与意义 航空电子系统经历了从**联合式架构**到**综合模块化航空电子**&#xff08;Integrated Modular Avionics, IMA&#xff09;架构的重大演变。在这一演变过程中&#xff0c;ARINC…

Vue-8-前端框架Vue之应用基础响应式数据和计算属性

文章目录 1 响应式数据1.1 ref创建基本类型的响应式数据1.2 reactive创建对象类型的响应式数据1.2.1 汽车示例(对象{})1.2.2 游戏示例(数组[])1.2.3 深层示例1.3 ref创建对象类型的响应式数据1.4 ref对比reactive1.4.1 区别和使用原则1.4.2 reactive重新分配新对象1.4.3 ref重新…