【小记】如何保证缓存和数据库的一致性

php服务器集群小记 服务器集群:多个服务配合来访问项目 分布式:同一个服务由多台服务器来共同分担 mysql的分布式操作 192.168.1.130-----------nginx 纯静态的文件 html 192.168.1.131-----------php php-fpm test.php 192.168.1.132-----------mysql 192.168.1.133-----------缓存... 阅读详情

2021-03-07

今天看到一个有意思的问题,如何保证缓存和数据库的一致性,思考后查资料总结如下。

要对数据库更新,如何处置缓存,更新or删除?

选择删除缓存。

因为要更新的数据可能是简单的也可能是复杂的,复杂的数据更新缓存的话,成本较大,所以选择删除缓存。

如果选择更新缓存的话,频繁的写操作意味着数据库和缓存都频繁更新,但重点是,该数据的读频率多大。根据28法则,20%的数据占了80%的访问量,对于某些缓存的频繁更新有点得不偿失。

先淘汰缓存还是先更新数据库?

先淘汰缓存

如果先更新数据库,再淘汰缓存,数据库更新完了之后,若缓存淘汰失败,那么后面读到的都是脏数据了,直到缓存失效。

如果先淘汰缓存,再更新数据库,如果数据库更新失败,只会造成一次缓存miss。相较而言,后者对业务的影响较小。

高并发下数据不一致问题的分析与解决

如下场景:同时有一个请求A进行更新操作,另一个请求B进行查询操作
(1)请求A进行写操作,删除缓存
(2)请求B发现缓存不存在
(3)请求B去数据库查询得到旧值
(4)请求B将查到的旧值写入缓存
(5)请求A将新值写入数据库

这样就出现了数据不一致的错误,导致脏读。

只有在对数据进行并发读写时,才会出现这样的问题。

其实并发量很低,特别是读很低,每天就1w的访问量,那么很少会出现上面的状况。

但问题是,如果每天的是上亿的流量,每秒并发读是几万,每秒只要有数据更新的请求,就可能会出现上述的数据库+缓存不一致的情况。

高并发了以后,问题是很多的。

解决方法

  • 延时双删策略
    在对数据写操作之前,删除缓存,延时1s后再将缓存删除。这样做可以将1s内的缓存脏数据清除。时间间隔可以根据具体业务设定。
  • 读请求和写请求串行化
    将读请求和写请求串行化,串到一个内存队列中去,这样就可以保证一定不会出现不一致的情况。

串行化之后,会导致系统的吞吐量大幅度降低,用比正常情况下多几倍的机器去支撑线上的一个请求。

一般来说,如果系统不是严格要求缓存+数据库必须一致性的话,缓存可以稍微的跟数据库偶尔有不一致的情况,最好不要做这个方案。

农业生产AI决策系统架构设计解密:数据层-模型层-应用层核心逻辑 想象一下,在一个炎热的夏日,传统农田里的农民伯伯正满头大汗地检查每一株玉米是否缺水;而几公里外的智慧农场里,一位年轻农民正在空调房里滑动手机屏幕,看着AI系统自动生成的灌溉计划——这就是农业生产AI决策系统带来的改变。本文的目的,就是要揭开这个"智能农业大脑"的面纱,详细讲解它的"身体构造"(架构设计)和"工作原理"(核心逻辑)。我们将聚焦系统最核心的三个部分:数据层(收集农田信息)、模型层(分析信息并思考决策)和应用层(将决策告诉农民)。 阅读详情

相关推荐

QT与Coin3D实现机器人的仿真

前言 Coin3D编程环境配置好后,开始下一步的机器人仿真任务。本文根据在研5轴机器人,完成三维模型生成与机器人的仿真。主要参考博主冯Jungle的博客,在此表示感谢。 ——2021.05.23 环境 Win10:VS2019、QT5.15.2、Coin3D、SolidWorks2016 机器人三维模型生成 目前广泛应用于因特网的VRML ( Virtual Reality Modeling Language,虚拟现实建模语言)为用户提供一种可参与的、并能对场景中对象主动做出反应的虚拟现实环境,现已成

焦露的博客 6908

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

如何保证缓存和数据库一致性?引入缓存提高性能缓存利用率和一致性问题并发引起的一致性问题删除缓存可以保证一致性吗?如何保证两步都执行?主从延迟和延迟双删问题可以做到强一致性吗?创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 如何保证缓存和数据库一致性? 很多人对这个问题依然有很多疑惑: 到底是更新缓存还是删除缓存? 选择先更新数据库在删除缓存,还

yang31842的博客 6180

InSAR图像配准:从像素级到亚像素级的精度提升策略

本文深入探讨了InSAR图像配准技术,从像素级到亚像素级的精度提升策略。通过分析最大频谱法和相干系数法的适用场景,结合频域补零插值和四叉树分块等高级技术,实现1/8像素级的高精度配准。文章还提供了实用的精度验证方法和常见问题排查指南,为InSAR数据处理提供全面解决方案。

nginx7reverse的博客 836

怎么保证 缓存和数据库中的数据一致

你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题? 首先需要考虑到:更新数据库或者更新缓存都有可能失败,在这种前提下分析业务带来的影响。   一般来说,如果允许缓存可以稍微的跟数据库偶尔有不一致的情况,也就是说如果你的系统不是严格要求“缓存+数据库” 必须保持一致性的话,最好不要做这个方案,即:读请求和写请求串行化,串到一个内存队列里去。   串行化可以保证一定不会出现不一致的情况,但是它也会导致系统的吞吐量大幅度降低,用比正常情.

样young的博客 1086

Camera Sensor接口协议全解析(六)聚焦onsemi HiSPi接口的技术突破与应用实践

摘要: Onsemi HiSPi是一种高速并行接口协议,专为高分辨率图像传感器设计,具备1600 Mbps传输速率、低功耗和高兼容性特点。通过对比DVP、MIPI CSI-2等主流协议,HiSPi在工业/医疗领域表现突出,支持动态功耗控制、多ROI和CRC校验。其创新架构包含多PHY设计,提供分组SP、流SP等多种工作模式,满足灵活传输需求。实际应用中,HiSPi在PCB缺陷检测(5μm精度)和液晶面板检测(0.3% Mura检出率)等场景展现卓越性能,成为高速成像领域的关键技术。

GateWorld的博客 1437

解决linux 2.5G网卡驱动问题

解决linux 2.5G网卡驱动问题 关键词:2.5G网卡驱动,ubuntu,安装,2.5G Ethernet LINUX driver,Realtek网卡驱动 由于2.5G网卡较新,各linux发行版的通用驱动已不适用,新装的系统会出现无法上网问题,由于国内网络环境去Realtek官网很难下载到驱动文件,故本文提供github上的2.5G Ethernet LINUX driver r8125 for kernel up to 5.6的版本驱动文件r8125-9.003.05.tar.bz2各位可以自

poorguy_aos的博客 1万+

nutz,今晚来一发(15): nutz支持多数据源同时回滚吗?有什么局限性?

考虑下面的代码代码, dao1和dao2分别使用不同的DataSo...

weixin_34223655的博客 211

【OpenClaw从入门到精通】第41篇:2026年4月最新版——从零开始搭建你的第一个安全AI助理(保姆级实战教程)

2026年3月CNCERT联合发布《OpenClaw安全使用实践指南》后,安全部署成为OpenClaw使用的核心前提。本文针对新手及进阶用户,基于官方安全指引,提供三套实战部署方案:阿里云一键部署(新手首选)、Docker容器隔离部署(进阶推荐)、本地安全安装(测试专用),并详解阿里云百炼Coding Plan API接入流程。全文涵盖环境准备、分步实操、安全加固、问题排查等全流程,所有命令可直接复制执行,无需依赖外部代码库。通过本文,读者可零基础搭建安全隔离的OpenClaw AI助理,兼顾实用性与安全性

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2200

【Redis】缓存问题小记

缓存穿透产生的原因是什么?用户请求的数据在缓存中和数据库中都不存在,不断发起这样的请求,给数据库带来巨大压力缓存穿透的解决方案有哪些?缓存null值布隆过滤增强id的复杂度,避免被猜测id规律做好数据的基础格式校验加强用户权限校验做好热点参数的限流。

陈宝子的博客 573

在ros中进行多传感器融合定位

ROS 中的 robots_localization 包是一个非常有用的包,可以使用各种卡尔曼滤波器融合任意数量的传感器!我们将使用它将全局姿势数据(x、y、z 和orientation)与机器人上的现有传感器融合,以实现更强大的定位!

如果想成为中心,那么就到中心去吧。 3003

PyTorch实战(25)——使用PyTorch构建DQN模型

深度Q网络 (Deep Q-learning Network, DQN) 在强化学习领域取得了巨大的成功和广泛的应用,PyTorch 结合 gymnasium 库为我们提供了强大的工具,支持在各种强化学习环境中测试不同类型的深度强化学习模型。在本节中,我们使用 PyTorch 框架构建使用卷积神经网络架构的 DQN 模型,模型通过自主学习掌握 Atari 经典游戏《Pong》的操作策略,最终实现击败电脑对手的竞技目标。

盼小辉丶的博客 3481

Redis八股小记

更好的办法是布隆过滤器,首先初始化一个比较大的数组,里面存放的是二进制0或1,全部初始化为0,当一个key来了之后,经过3次Hash计算,模数组长度得到下标,并在原来的位置改为1。但是在这之间,插入了线程2,线程2查询缓存未命中,接着查询数据库,并写入缓存,此时线程1更新数据库,那么就发生了缓存与数据库数据不一致的情况了。可以缓存null值,对不存在的数据key的value缓存为null,这种方法很大的弊端就是内存占用和数据不一致(如果下次真的要储存当前数据,会导致缓存与数据库数据不一致)。

朝碧海而暮苍梧 966

【YOLO26科研级突破】集成BiFPN双向特征金字塔,让多尺度特征融合效率与精度双跃升

打开确保模型解析器能识别BiFPN模块。通过将BiFPN双向特征金字塔集成到YOLO26中,我们实现了一个“全尺度双向特征流动+加权融合+精准检测”的目标检测模型。这个改进不仅在工程上能大幅提升多尺度、复杂场景下的检测精度,更在科研上提供了“双向特征融合”的创新思路——这种思路可以延伸到其他检测网络(如Faster R-CNN、SSD)的Neck模块改进中,帮你在论文中打造独特的研究点。

LXY_LOVE36的博客 200

redis小记

RDB是一种快照持久化方式,它通过定期将Redis内存中的数据集保存到磁盘上的一个二进制文件中(通常命名为dump.rdb)。这个文件是一个紧凑的二进制文件,包含了某个时间点的完整数据快照。当Redis重新启动时,它可以加载这个RDB文件,恢复到上次保存的时间点。AOF是一种日志持久化方式,它记录了服务器执行的所有写操作命令。这些命令会以追加的方式写入到AOF文件中,当Redis需要恢复数据时,只需执行AOF文件中的命令就可以恢复到原来的状态。rdb持久化开启时,save会进行压缩存储导致一些乱码。

google20的博客 620

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Redis 小记

redis 知识点小记

yunxiaobaobei的博客 430

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Redis学习小记一:基于Docker、Linux部署Redis

基于Linux系统Docker或者Linux本机环境进行Redis的安装与部署以及Redis的进阶部署:主从配置、哨兵模式、集群配置。详细的讲解了Redis各种配置模式的方法以及意义。

yihaochengxuyuan的博客 1961

从“摆渡人“到“造桥者“,Doris湖和仓的牵手历程

从"摆渡人"到"造桥者",Doris湖和仓的牵手历程

yzData的博客 1123

mybatis小记——数据库连接池实现

简单实现 说到数据库连接池的实现,可能大家并不陌生,应该都或多或少的实现过,那么先来说说一个简单的数据库连接池的实现。 既然是连接池,首先得有连接,然后有池子(废话),连接使用jdk的Connection,池子使用一个List<Connection>即可,需要连接的时候从list中获取,如果list中没有那么就新new一个并加入到list中就可以了。使用完成之后,将连接放回list...

m47838704的专栏 2868

C3P0连接池小记

C3P0连接池小记之前虽然有时候用到数据库连接池,但是一直没有关注过细节,在最近做的一个项目中,遇到了一些问题,这里总结下,不足之处还望指出。数据库连接池的概念数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。(

sheen口开河 1628

Redis知识小记

一、单线程的redis为什么这么快? 1、Redis的所有操作都在内存中; 2、Redis是单线程的,避免了线程上下文切换引起的额外性能开销。同时,单线程避免了多线程的数据同步问题,没有加锁释放锁操作; 3、数据结构简单,对数据结构的操作也简单; 4、使用多路复用IO(类似java的NIO),多路是指多个网络连接,复用是指多个网络连接复用同一个处理线程,处理线程会依次轮询有IO操作的请求,...

我的酒馆,名叫夜未央 287

关于项目高并发问题小记

多个线程同时访问同一个资源时就会产生并发问题,高并发是判断一个项目优劣的重要因素。

m0_63201682的博客 683

linux存储小记

类别描述定义ECC(Error Checking and Correcting)是一种错误检查和纠正技术,能够检测并纠正常见的内存数据损坏情况工作原理• 包含附加内存位和内存控制器• 使用控制器监控附加芯片中的校验位• 能够实时检测和纠正内存错误。

weixin_40539956的博客 1650

redis高级小记

一、删除策略 删除策略指对已经过期的数据删除的方式 1.1定时删除 : 到点就删 牺牲CPU的性能换取内存的空间 1.2 惰性删除 : 当使用该数据时进行检查,如果到期就删除 牺牲内存的空间换取CPU的性能 1.3 定期删除 : 以固定的频率去检查key是否过期,如果过期就删除 二、淘汰策略 当添加新数据时如果redis的内存已经使用完,此时redis会删除部分数据,保证新数据进来。 redis会优先删除设置了过期时间的数据(易失数据),如果处理完之后空间还不够此时在做全库扫描 淘汰...

weixin_56600230的博客 192

Spring事务踩坑小记

这里一开始犯错了,没有想到两种查询方式导致不在同一个事务引发的这个问题,所以才经历了上面各种尝试,最终结果就是只要保证新增查询或修改查询在同一个事务内,基于mysql的快照读就不会存在缓存刷新时查到的是老数据问题。其实这里又差不多回到了代码1的样子,把刷新缓存的逻辑还是放到了testA方法保证在同一个事务里,这里最大的改动就是把刷新缓存查询时候用jpa执行改成了通过jdbcTemplate,从代码来看是在同一个事务里面,当批量新增或修改完后异步刷新缓存,出现问题的原因:事务未提交,然后先执行了异步刷新?

提供各种学习资源及帮助 200

字节跳动技术支持面试小记

2020.6.11上午,有幸参与了字节跳动技术支持岗的视频面试。暂且记录下面试问的问题吧。 1、自我介绍 2、mybatis的缓存原理 3、微服务注册中心的原理 4、如何保证rocketMq的高可用 5、工作中有没有做过数据库的主从同步(就当做数据主从同步的原理吧) 6、抓包工具用过哪些,讲一下抓包处理问题的流程,比如:接口返回500错误怎么处理 7、spring的ioc原理 8、数据库(MySql)的索引有哪些、原理是什么、使用的注意事项、结合实际工作讲一下(如何定位查询慢的问题) 9、

qq_15720911的博客 4553

PWA小记

前言 中国有不一样的MobileFirst战略,重原生应用,轻移动网页; 移动网页的弱势:页面设计优化有限,用户体验受网络环境影响,网页开启不方便; web优势是产品分发 app优势是产品使用和交互 一. PWA带来的特性 能够显著提高应用加载速度,快速响应,并且有平滑的动画响应用户的操作 甚至让 web 应用可以在离线环境使用 (Service Worke...

weixin_30252155的博客 223
上一篇: 【算法】一个背包问题
下一篇: 【小记】为什么jvm的新生代要分为一个Eden和两个Survivor
皮皮蟹01
博客等级 码龄10年 29粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值