你知道缓存的这个问题到底把多少程序员坑惨了吗?

news2024/11/28 19:49:44

在现代系统中,缓存可以极大地提升性能,减少数据库的压力。

然而,一旦缓存和数据库的数据不一致,就会引发各种诡异的问题。

我们来看看几种常见的解决缓存与数据库不一致的方案,每种方案都有各自的优缺点

图片

先更新缓存,再更新数据库

这种方案看似简单,实际上很少被推荐。

原因在于如果在更新数据库之前发生了错误,缓存中的数据将和数据库中的数据不一致,最终导致更大的问题。

图片

先更新数据库,再更新缓存

这种方法解决了更新缓存失败的问题,但可能引发另外一个问题:

在高并发场景下,数据库已经更新,但缓存还没有更新时,其他请求可能会读到旧的缓存数据。

图片

先删除缓存,后更新数据库

这种方案在高并发下容易产生问题:

在缓存删除和数据库更新之间的时间窗口内,其他请求可能会读取到旧的数据,导致短时间内的数据不一致

图片

先更新数据库,后删除缓存

这是较为推荐的一种方法,但在高并发场景下也有一定的局限性:

如果数据库更新成功但缓存删除失败,可能导致短时间内的数据不一致。

图片

强一致性与最终一致性

在讨论一致性的时候,我们常常会提到强一致性和最终一致性。

图片

根据业务需求权衡这两者,是缓存策略设计中的重要一步。

后面我会给出一个弱一致性的推荐方案,供大家参考。

SpringCache是一个非常实用的缓存管理框架,能帮助我们简化缓存操作。

以下是一个简单的SpringCache配置示例:

图片

图片

图片

缓存预热策略

缓存预热的重要性不言而喻,上线后瞬时大流量可能导致缓存击穿。

以下是几种常见的缓存预热方案:

  1. 启动时加载:系统启动时加载常用数据到缓存。

    图片

  2. 定时加载:定时任务定期加载数据。

    图片

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

    图片

推荐方案

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

图片

这是一种非常简单且成本很低的操作,但能解决绝大多数的缓存与数据库不一致问题。

原理很好理解,就是更新数据库之后设置合理的休眠时间,然后再次删除掉其他线程请求进来导致的旧缓存,最终达到缓存和数据库都是最新数据的目的。

其中休眠时间要根据自身业务的平均耗时来决定,而延迟双删其实就够了,延迟三删只是为了开阔大家的思路,因为真有些公司删除三次来保证一些极端情况的不一致,但我觉得没必要,太极端就不是弱一致性了。

如果是比较复杂的项目,甚至能再进一步的优化,也就是借用定时任务MQ来替代休眠线程,实现异步删除缓存,达到弱一致性的结果。

最后说一句(求关注!别白嫖!)

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、转发、在看。

关注公众号:woniuxgg,在公众号中回复:笔记  就可以获得蜗牛为你精心准备的java实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!

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

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

相关文章

探索NSL-KDD数据集:入侵检测的起点

引言 在信息安全的世界里,数据集是我们最宝贵的资源。就像厨师离不开食材,数据科学家也离不开数据集。对于入侵检测系统(IDS)而言,NSL-KDD数据集无疑是一个经典的选择。今天,我们将深入探讨这个数据集&…

Python数据分析案例56——灰色预测、指数平滑预测人口数量,死亡率,出生率等

案例背景 时间序列的预测现在都是用神经网络,但是对于100条以内的小数据集,神经网络,机器学习这种方法效果表现不太好。 所以还是需要用上一些传统的统计学方法来进行预测,本次就使用灰色预测,指数平滑两大方法来分别…

MySQL学习(16):视图

视图是一种虚拟临时表,并不真正存储数据,它的作用就是方便用户查看实际表的内容或者部分内容 1.视图的使用语法 (1)创建 create view 视图名称 as select语句; #视图形成的虚拟表就来自于select语句所查询的实际表,…

突破•指针四

听说这是目录哦 函数指针数组🫧用途:转移表 回调函数🫧能量站😚 函数指针数组🫧 函数指针数组是存放函数地址的数组,例如int (*parr[5])()中parr先和[]结合,说明parr是可以存放5个函数地址【元…

IT运维必备神器!PsShutdown,定时关机重启一键搞定!

嘿,各位技术小能手们,小江湖今天要给大家安利一个宝贝——PsShutdown!这可不是一般的关机小工具哦;当你坐在电脑前,手指轻轻敲几下键盘,就能实现定时任务,无论是关机、重启,还是注销…

Python 爬虫入门(四):使用 pandas 处理和分析数据 「详细介绍」

Python 爬虫入门(四):使用 pandas 处理和分析数据 「详细介绍」 前言1. pandas简介1.1 什么是pandas?1.2 为什么要使用pandas?1.3 安装 Pandas 2. pandas的核心概念2.1 Series2.2 DataFrame2.3 索引 3. 数据导入和导出3.1 从CSV文件读取数据…

uniapp app跳小程序详细配置

应用场景 app跳微信小程序,支付等 前提配置 1.1微信开放平台申请移动应用 1.2关键:开放平台的移动应用的app的包名和签名必须和uniapp app的包名一致 1.3查看unaipp app的包的签名 下载工具:GenSignature,模拟器安装工具 ht…

iframe嵌套项目后,接口跳出登入页面(会出现画中画的场景)

iframe嵌套项目后,接口跳出登入页面(会出现画中画的场景) JavaScript 跳出iframe框架 window.top top 属性返回最顶层的先辈窗口。该属性返回对一个顶级窗口的只读引用。如果窗口本身就是一个顶级窗口,top 属性存放对窗口自身的…

使用DTW算法简单实现曲线的相似度计算

相对接近产品交付形态的实现:基于DTW距离的KNN算法实现股票高相似筛选案例-CSDN博客 一、问题背景和思路 问题背景:如果你有历史股票的K线图,怎么从众多股票K线图中提取出TopN相似的几支股票,用来提供给投资者或专家做分析、决策…

任意空间平面点云旋转至与水平面平行(python)

1、背景介绍 将三维空间中位于任意平面上的点云数据,通过一系列的坐标变换(平移旋转),使其投影到与XOY平面平行,同时点云形状保持不变。具体效果如下,对于原始点集(蓝色点集)&#x…

关于 AGGLIGATOR(猛禽)网络宽频聚合器

AGGLIGATOR 是一个用于多个链路UDP/IP带宽聚合的工具软件,类似MTCP的作用,不过它是针对UDP/IP宽频聚合的。 举个例子: 中国大陆有三台公网服务器,中国香港有一台大带宽服务器。 那么: AGGLIGATOR 允许中国大陆的客户…

【C++高阶】:深入探索C++11

✨ 心似白云常自在,意如流水任东西 🌏 📃个人主页:island1314 🔥个人专栏:C学习 🚀 欢迎关注:👍点赞 &#x1f4…

Prometheus+Grafana+Alertmanager监控告警

PrometheusGrafanaAlertmanager告警 Alertmanager开源地址:github.com/prometheus Prometheus是一款基于时序数据库的开源监控告警系统,它是SoundCloud公司开源的,SoundCloud的服务架构是微服务架构,他们开发了很多微服务&#xf…

【实际源码】工厂进销存管理系统(仓库、采购、生产、销售)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程&#xff…

亚马逊云科技 re:Inforce 2024中国站大会

亚马逊云科技 re:Inforce 2024中国站大会 - 生成式AI时代的全面安全,将于7月25日本周四在北京富力万丽酒店揭幕

向量数据库(二):Qdrant

写在前面 我们借助 Qdrant 来了解向量数据库的一些内容 内容 什么是 Qdrant? Qdrant 是一个开源的针对向量相似性搜索的引擎,它提供了一系列的 API 用于对向量数据进行存储、搜索和管理等功能。 下面是来自 Qdrant 官网的一个架构图: 初步了解 Qdrant 里的一些概念 …

h5页面 打开自动跳转小程序

移动端项目中打开页面&#xff0c;直接跳转到小程序功能效果图 pc mobile 代码 样式代码css&#xff1a; <style>* {margin: 0;padding: 0;}html,body {height: 100%;}.full {position: absolute;top: 0;bottom: 0;left: 0;right: 0;}.public-web-container {displa…

每日OJ_牛客CM26 二进制插入

目录 牛客CM26 二进制插入 解析代码 牛客CM26 二进制插入 二进制插入_牛客题霸_牛客网 解析代码 m:1024&#xff1a;100000000 00 n:19 &#xff1a; 10011 要把n的二进制值插入m的第j位到第i位&#xff0c;只需要把n先左移j位&#xff0c;然后再进行或运算&#xff08;|&am…

JS知识点巩固

目录 前言 一、reduce方法 二、二维数组的行和列交换 总结 前言 这里的知识点记录的是日常生活中容易搞忘的知识点 一、reduce方法 function(total,currentValue, index,arr) redece可以用作累加&#xff1a;可以传入初始值&#xff0c;如果传入初始值&#xff0c;则从累加…

【FAS】《The Research of RGB Image Based Face Anti-Spoofing》

文章目录 1、原文2、相关工作3、基于特征解耦的人脸活体检测算法3.1、方法3.2、实验结果 4、基于解构与组合的人脸活体检测方法4.1、方法4.2、实验 5、作者总结6、结论&#xff08;own&#xff09;7、附录7.1、CycleGAN7.2、InfoGAN7.3、3D Face 1、原文 [1]张克越.基于RGB图像…