高并发场景下,到底先更新缓存还是先更新数据库? 📅 发布时间:2026/7/15 8:54:38 👁️ 浏览次数: 在大型系统中为了减少数据库压力通常会引入缓存机制一旦引入缓存又很容易造成缓存和数据库数据不一致导致用户看到的是旧数据。为了减少数据不一致的情况更新缓存和数据库的机制显得尤为重要接下来带领大家踩踩坑。Cache asideCache aside也就是旁路缓存是比较常用的缓存策略。1读请求常见流程Cache aside 读请求应用首先会判断缓存是否有该数据缓存命中直接返回数据缓存未命中即缓存穿透到数据库从数据库查询数据然后回写到缓存中最后返回数据给客户端。2写请求常见流程Cache aside 写请求首先更新数据库然后从缓存中删除该数据。看了写请求的图之后有些同学可能要问了为什么要删除缓存直接更新不就行了这里涉及到几个坑我们一步一步踩下去。Cache aside踩坑Cache aside策略如果用错就会遇到深坑下面我们来逐个踩。踩坑一先更新数据库再更新缓存如果同时有两个写请求需要更新数据每个写请求都先更新数据库再更新缓存在并发场景可能会出现数据不一致的情况。先更新数据库再更新缓存如上图的执行过程1写请求1更新数据库将 age 字段更新为182写请求2更新数据库将 age 字段更新为203写请求2更新缓存缓存 age 设置为204写请求1更新缓存缓存 age 设置为18执行完预期结果是数据库 age 为20缓存 age 为20结果缓存 age为18这就造成了缓存数据不是最新的出现了脏数据。踩坑二先删缓存再更新数据库如果写请求的处理流程是先删缓存再更新数据库在一个读请求和一个写请求并发场景下可能会出现数据不一致情况。先删缓存再更新数据库如上图的执行过程1写请求删除缓存数据2读请求查询缓存未击中(Hit Miss)紧接着查询数据库将返回的数据回写到缓存中3写请求更新数据库。整个流程下来发现数据库中age为20缓存中age为18缓存和数据库数据不一致缓存出现了脏数据。踩坑三先更新数据库再删除缓存在实际的系统中针对写请求还是推荐先更新数据库再删除缓存但是在理论上还是存在问题以下面这个例子说明。先更新数据库再删除缓存如上图的执行过程1读请求先查询缓存缓存未击中查询数据库返回数据2写请求更新数据库删除缓存3读请求回写缓存整个流程操作下来发现数据库age为20缓存age为18即数据库与缓存不一致导致应用程序从缓存中读到的数据都为旧数据。但我们仔细想一下上述问题发生的概率其实非常低因为通常数据库更新操作比内存操作耗时多出几个数量级上图中最后一步回写缓存set age 18速度非常快通常会在更新数据库之前完成。如果这种极端场景出现了怎么办我们得想一个兜底的办法缓存数据设置过期时间。通常在系统中是可以允许少量的数据短时间不一致的场景出现。Read through在 Cache Aside 更新模式中应用代码需要维护两个数据源头一个是缓存一个是数据库。而在Read-Through策略下应用程序无需管理缓存和数据库只需要将数据库的同步委托给缓存提供程序Cache Provider即可。所有数据交互都是通过抽象缓存层完成的。Read-Through流程如上图应用程序只需要与Cache Provider交互不用关心是从缓存取还是数据库。在进行大量读取时Read-Through可以减少数据源上的负载也对缓存服务的故障具备一定的弹性。如果缓存服务挂了则缓存提供程序仍然可以通过直接转到数据源来进行操作。Read-Through 适用于多次请求相同数据的场景这与 Cache-Aside 策略非常相似但是二者还是存在一些差别这里再次强调一下在 Cache-Aside 中应用程序负责从数据源中获取数据并更新到缓存。在 Read-Through 中此逻辑通常是由独立的缓存提供程序Cache Provider支持。Write throughWrite-Through策略下当发生数据更新(Write)时缓存提供程序Cache Provider负责更新底层数据源和缓存。缓存与数据源保持一致并且写入时始终通过抽象缓存层到达数据源。Cache Provider类似一个代理的作用。Write-Through流程Write behindWrite behind在一些地方也被成为Write back 简单理解就是应用程序更新数据时只更新缓存Cache Provider每隔一段时间将数据刷新到数据库中。说白了就是延迟写入。Write behind流程如上图应用程序更新两个数据Cache Provider 会立即写入缓存中但是隔一段时间才会批量写入数据库中。这种方式有优点也有缺点优点是数据写入速度非常快适用于频繁写的场景。缺点是缓存和数据库不是强一致性对一致性要求高的系统慎用。总结一下学了这么多相信大家对缓存更新的策略都已经有了清晰的认识。最后稍稍总结一下。缓存更新的策略主要分为三种Cache asideRead/Write throughWrite behindCache aside 通常会先更新数据库然后再删除缓存为了兜底通常还会将数据设置缓存时间。Read/Write through 一般是由一个 Cache Provider 对外提供读写操作应用程序不用感知操作的是缓存还是数据库。Write behind简单理解就是延迟写入Cache Provider 每隔一段时间会批量输入数据库优点是应用程序写入速度非常快。
ADS58J63 JESD204B接口配置与调试实战指南 1. 项目概述与核心价值 在宽带接收机、相控阵雷达或者多通道软件无线电这类对数据吞吐量和信号纯净度要求极高的系统中,高速模数转换器(ADC)与现场可编程门阵列(FPGA)之间的数据传输一直是个设计难点。传统的并行LVDS接… 2026/7/15 8:46:35
RetroWrite x64与ARM64版本对比:功能差异与架构支持详解 RetroWrite x64与ARM64版本对比:功能差异与架构支持详解 【免费下载链接】retrowrite RetroWrite -- Retrofitting compiler passes through binary rewriting 项目地址: https://gitcode.com/gh_mirrors/re/retrowrite RetroWrite是一款强大的静态二进制重写… 2026/7/15 8:44:34
影刀RPA 异常登录检测:多源IP比对与安全告警 影刀RPA 异常登录检测:多源IP比对与安全告警 作者:林焱 什么情况用什么 安全团队最怕的事:员工账号被盗了,但两天后才从审计日志里发现。如果能做到"异地IP登录→30秒内告警",损失可以减到最小。 影刀RPA… 2026/7/15 8:44:34
滑动窗口算法详解:从原理到C++实战,解决子数组与子串问题 1. 项目概述:为什么“滑动窗口”是算法中的“移动窗帘”? 如果你写过C,处理过数组或字符串,大概率遇到过这样的问题:在一个很长的序列里,找一段连续的子序列,它满足某种条件,比如和最… 2026/7/15 13:18:22
3步智能激活方案:告别Windows与Office授权烦恼的终极指南 3步智能激活方案:告别Windows与Office授权烦恼的终极指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是否曾因Windows系统突然弹出"激活Windows"的提示而中断工作&a… 2026/7/15 13:18:22
aops-hermes完全解析:一站式Web运维管理平台核心功能与架构详解 aops-hermes完全解析:一站式Web运维管理平台核心功能与架构详解 【免费下载链接】aops-hermes Web for aops. 项目地址: https://gitcode.com/openeuler/aops-hermes 前往项目官网免费下载:https://ar.openeuler.org/ar/ aops-hermes是openEuler… 2026/7/15 13:14:11
如何告别网盘限速?这款开源神器让你轻松获取8大网盘真实下载链接 如何告别网盘限速?这款开源神器让你轻松获取8大网盘真实下载链接 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云… 2026/7/15 13:12:10
基于S7-200 PLC与MCGS组态软件的工业设备远程监控与数据可视化方案 1. 工业监控系统的基础架构解析 在中小型工业场景中,一套可靠的监控系统通常由三个核心部分组成: PLC控制器 、 组态软件 和 人机交互界面 。西门子S7-200 PLC作为经典的小型控制器,其稳定性和性价比在业内口碑良好。我曾在一个水泵站改… 2026/7/15 13:12:10
5分钟掌握猫抓:浏览器资源嗅探的终极指南与高效下载解决方案 5分钟掌握猫抓:浏览器资源嗅探的终极指南与高效下载解决方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否经常遇到想要保存网… 2026/7/15 13:12:10
行星减速机的工作原理是什么?从齿轮运动关系到减速比计算 一、行星齿轮机构的组成 标准行星齿轮机构主要包括: 太阳轮; 行星轮; 内齿圈; 行星架。 太阳轮位于机构中心。 多个行星轮围绕太阳轮均匀布置,行星轮内侧与太阳轮外啮合,外侧与内齿圈内啮合。 行星轮通过轴… 2026/7/15 0:03:00
阅读Java开源框架源码的心得分享! 前几日闲来无事有幸看到了一位博主分享自己阅读开源框架源码的心得,看了之后也引发了我的一些深度思考。我们为什么要看源码?我们该怎么样去看源码? 其中前者那位博主描述的我觉得很全了(如下图所示),就不做… 2026/7/15 0:03:00
【LINUX】驱动 【LINUX驱动】【字符设备】【中断】【Platform】【网课 设备树】【GPIO】【PINCTRL】【INPUT】【IIC】【SPI】【网络驱动】【屏幕驱动】【一 设备树】【二 内核模块编译】【三 基本驱动框架】【四 Platform总线设备驱动框架】【五 驱动子系统】【六 综合】 2026/7/15 0:07:01
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/13 8:31:55
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/14 18:25:04
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/14 5:09:41