你知道缓存的这个问题到底把多少程序员坑惨了吗?
在现代系统中,缓存可以极大地提升性能,减少数据库的压力。
然而,一旦缓存和数据库的数据不一致,就会引发各种诡异的问题。
我们来看看几种常见的解决缓存与数据库不一致的方案,每种方案都有各自的优缺点

先更新缓存,再更新数据库
这种方案看似简单,实际上很少被推荐。
原因在于如果在更新数据库之前发生了错误,缓存中的数据将和数据库中的数据不一致,最终导致更大的问题。

先更新数据库,再更新缓存
这种方法解决了更新缓存失败的问题,但可能引发另外一个问题:
在高并发场景下,数据库已经更新,但缓存还没有更新时,其他请求可能会读到旧的缓存数据。

先删除缓存,后更新数据库
这种方案在高并发下容易产生问题:
在缓存删除和数据库更新之间的时间窗口内,其他请求可能会读取到旧的数据,导致短时间内的数据不一致

先更新数据库,后删除缓存
这是较为推荐的一种方法,但在高并发场景下也有一定的局限性:
如果数据库更新成功但缓存删除失败,可能导致短时间内的数据不一致。
强一致性与最终一致性
在讨论一致性的时候,我们常常会提到强一致性和最终一致性。

根据业务需求权衡这两者,是缓存策略设计中的重要一步。
后面我会给出一个弱一致性的推荐方案,供大家参考。
SpringCache是一个非常实用的缓存管理框架,能帮助我们简化缓存操作。
以下是一个简单的SpringCache配置示例:



缓存预热策略
缓存预热的重要性不言而喻,上线后瞬时大流量可能导致缓存击穿。
以下是几种常见的缓存预热方案:
-
启动时加载:系统启动时加载常用数据到缓存。

-
定时加载:定时任务定期加载数据。

-
手动加载:手动执行预热脚本。

推荐方案
综合考虑各种方案的优缺点,我给大家一种工作中真正常用的方案,也是我待过的互联网公司中实践过的方案。

这是一种非常简单且成本很低的操作,但能解决绝大多数的缓存与数据库不一致问题。
原理很好理解,就是更新数据库之后设置合理的休眠时间,然后再次删除掉其他线程请求进来导致的旧缓存,最终达到缓存和数据库都是最新数据的目的。
其中休眠时间要根据自身业务的平均耗时来决定,而延迟双删其实就够了,延迟三删只是为了开阔大家的思路,因为真有些公司删除三次来保证一些极端情况的不一致,但我觉得没必要,太极端就不是弱一致性了。
如果是比较复杂的项目,甚至能再进一步的优化,也就是借用定时任务和MQ来替代休眠线程,实现异步删除缓存,达到弱一致性的结果。
最后说一句(求关注!别白嫖!)
如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、转发、在看。
关注公众号:woniuxgg,在公众号中回复:笔记 就可以获得蜗牛为你精心准备的java实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!
相关文章:
你知道缓存的这个问题到底把多少程序员坑惨了吗?
在现代系统中,缓存可以极大地提升性能,减少数据库的压力。 然而,一旦缓存和数据库的数据不一致,就会引发各种诡异的问题。 我们来看看几种常见的解决缓存与数据库不一致的方案,每种方案都有各自的优缺点 先更新缓存&…...
飞创直线模组桁架机械手优势及应用领域
随着工业自动化和智能制造的发展,直线模组桁架机械手极大地减轻了人类的体力劳动负担,在危险性、重复性高的作业环境中展现出了非凡的替代能力,引领着工业生产向自动化、智能化方向迈进。 一、飞创直线模组桁架机械手优势 飞创直线模组桁架…...
TongHttpServer 简介
1. 概述 随着网络技术的飞速发展,高并发大用户场景越来越普遍,单一应用服务节点已经不能满足并发需求,为了提高整个系统可靠性,扩展性,吞吐率,通常将多个应用服务器通过硬负载/软负载组成集群,负载均衡器根据不同负载算法将请求分发到各个应用服务器节点。 Tong…...
回溯法---组合总和
题目: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限…...
将Android Library项目发布到JitPack仓库
将项目代码导入Github 1.将本地项目目录初始化为 Git 仓库。 默认情况下,初始分支称为 main; 如果使用 Git 2.28.0 或更高版本,则可以使用 -b 设置默认分支的名称。 git init -b main 如果使用 Git 2.27.1 或更低版本,则可以使用 git symbo…...
JAVAWeb实战(后端篇)
因为前后端代码内容过多,这篇只写后端的代码,前端的在另一篇写 项目实战一: 1.创建数据库,表等数据 创建数据库 create database schedule_system 创建表,并添加内容 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------…...
【vs】实用调试技巧——学会写优秀的代码!
🦄个人主页:小米里的大麦-CSDN博客 🎏所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html ⚙️操作环境:Visual Studio 2022 目录 一、前言 二、什么是BUG? 三、调试是什么?有多重要? 一名优秀…...
数组声明方式
数组声明方式 一、 一维数组 元素数据类型[] 数组名; // 推荐元素数据类型 数组名[]; 二、 二维数组 元素数据类型[][] 数组名称; // 推荐元素数据类型 数组名称[][];元素数据类型[] 数组名称[]; 注: 对于第三种方式元素数据类型[] 数组名称[];,可…...
Docker中Docker网络-理解Docker0与自定义网络的使用示例
场景 CentOS7中Docker的安装与配置: CentOS7中Docker的安装与配置_centos docker sock-CSDN博客 在上面安装好Docker之后。 关于对Docker中默认docker0以及自定义网络的使用进行学习。 注: 博客:霸道流氓气质-CSDN博客 实现 理解dock…...
领域驱动大型结构之SYSTEM METAPHOR(系统隐喻)
在领域驱动设计(Domain-Driven Design, DDD)中,"System Metaphor" 是一种用于帮助开发团队和业务人员在理解和沟通系统时使用的概念模型。虽然 "System Metaphor" 并不是 DDD 的核心概念,但它在敏捷开发方法&…...
web前端开发一、VScode环境搭建
1、VScode安装live server插件,写完代码后,保存就会在浏览器自动更新,不需要再去浏览器点击刷新了 2、创建html文件 3、在文件中输入感叹号 ! 4、选择第一个,然后回车,就会自动输入html的标准程序 5、…...
DiAD代码use_checkpoint
目录 1、梯度检查点理解2、 torch.utils.checkpoint.checkpoint函数 1、梯度检查点理解 梯度检查点(Gradient Checkpointing)是一种深度学习优化技术,它的目的是减少在神经网络训练过程中的内存占用。在训练深度学习模型时,我们需…...
nginx出现Refused to apply inline style because it violates
Content Security Policy的错误。根据错误提示,nginx拒绝应用内联样式,因为它违反了内容安全策略(Content Security Policy)。内容安全策略是一种浏览器机制,用于防止潜在的安全漏洞,通过限制从外部来源加载…...
【中项第三版】系统集成项目管理工程师 | 第 11 章 规划过程组⑥ | 11.15 - 11.17
前言 第11章对应的内容选择题和案例分析都会进行考查,这一章节属于10大管理的内容,学习要以教材为准。本章上午题分值预计在15分。 目录 11.15 规划资源管理 11.15.1 主要输入 11.15.2 主要工具与技术 11.15.3 主要输出 11.16 估算活动资源 11.1…...
基础警务互联网app
智慧公安以大数据、云计算、人工智能、物联网和移动互联网技术为支撑,以“打、防、管、控”为目的,综合研判为核心,共享信息数据资源,融合业务功能,构建公安智慧大数据平台,实现公安信息数字化、网络化和智…...
为了方便写CURD代码,我在UTools写了个插件SqlConvert来生成代码!
-1. 前言 为了方便摸鱼,我之前写过一个通过sql生成代码的工具,但是服务器到期了,也就懒得重新部署了。 技术框架是 SpringBoot MybatisPlus Velocity Vue ElementUI Sql-ParseeSql-Parser-ui 0. Utools应用安装 官网地址: https://u.too…...
在国产芯片上实现YOLOv5/v8图像AI识别-【2.2】RK3588上C++开发环境准备及测试更多内容见视频
本专栏主要是提供一种国产化图像识别的解决方案,专栏中实现了YOLOv5/v8在国产化芯片上的使用部署,并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。 B站配套视频:https://www.bilibili.com/video/BV1or421T74f 板子…...
2024数据资产入表财务实操手册
关注公众号《方案驿站》,并私信:2024数据资产入表财务实操手册,可获取本文pdf文件。...
react.16+
1、函数式组件 在vite脚手架中执行: app.jsx: import { useState } from react import reactLogo from ./assets/react.svg import viteLogo from /vite.svg import ./App.cssfunction App() {console.log(this)return <h2>我是函数式组件</h2> }exp…...
如何实现MySQL对某一张表的binlog日志进行记录
在 MySQL 中,使用触发器(Triggers)来记录表的变更是一种常见的方法。下面是具体的配置和步骤: 1. 创建日志表 首先,需要创建一个日志表,用于存储变更记录。 CREATE TABLE my_table_log (id INT AUTO_INC…...
5步攻克TradingAgents-CN本地化部署:从环境搭建到智能体协同
5步攻克TradingAgents-CN本地化部署:从环境搭建到智能体协同 【免费下载链接】TradingAgents-CN 基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版 项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN 一、问题定位࿱…...
73:L的程序安全:蓝队的规范防御
作者: HOS(安全风信子) 日期: 2026-03-26 主要来源平台: GitHub 摘要: 程序安全是防御的基石,通过规范的流程、自动化执行和可追溯设计构建可靠的安全防御体系。本文分享程序安全的核心价值、L的程序安全策略、技术实现…...
Ostrakon-VL扫描终端部署:支持HTTPS与Basic Auth安全访问
Ostrakon-VL扫描终端部署:支持HTTPS与Basic Auth安全访问 1. 项目概述 Ostrakon-VL扫描终端是一款基于Ostrakon-VL-8B多模态大模型开发的Web交互应用,专为零售与餐饮行业场景优化设计。与传统工业级UI不同,该终端采用高饱和度的像素艺术风格…...
LumiPixel开箱即用教程:快速上手这个专为人像设计的AI创作平台
LumiPixel开箱即用教程:快速上手这个专为人像设计的AI创作平台 1. 认识LumiPixel:纯净人像创作平台 LumiPixel: Canvas Quest是一款专注于人像创作的AI视觉平台,它将先进的Z-Image扩散模型与复古像素艺术美学完美结合。这个平台特别适合需要…...
Windows右键菜单重构指南:从混乱到高效的ContextMenuManager实战
Windows右键菜单重构指南:从混乱到高效的ContextMenuManager实战 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 问题诊断:你的右键菜单是…...
终极揭秘:4步掌握Unity视觉还原技术核心
终极揭秘:4步掌握Unity视觉还原技术核心 【免费下载链接】UniversalUnityDemosaics A collection of universal demosaic BepInEx plugins for games made in Unity3D engine 项目地址: https://gitcode.com/gh_mirrors/un/UniversalUnityDemosaics Universa…...
XHS-Downloader:构建高效采集流程的无水印内容批量管理方案
XHS-Downloader:构建高效采集流程的无水印内容批量管理方案 【免费下载链接】XHS-Downloader 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作品、用户链接…...
OBS多平台直播同步解决方案:从配置到优化的完整指南
OBS多平台直播同步解决方案:从配置到优化的完整指南 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 在当今内容创作领域,多平台同步直播已成为扩大受众覆盖的关键…...
万象视界灵坛惊艳案例:浅蓝格点背景中生成的‘同步率’进度条动态响应过程
万象视界灵坛惊艳案例:浅蓝格点背景中生成的"同步率"进度条动态响应过程 1. 效果展示概述 在视觉识别领域,传统界面往往显得单调乏味。万象视界灵坛通过创新的像素风格设计,将复杂的语义对齐过程转化为一场视觉盛宴。本次展示的核…...
交叉编译microcom
由于默认的busybox没有支持microcom工具,也没有提供源码,所以需要自己交叉编译microcom工具。 microcom工具 https://packages.ubuntu.com/zh-cn/plucky/microcom 下载ubuntu带的软件包microcom,下载microcom_2023.09.0.orig.tar.xz版本&…...

