当前位置: 首页 > news >正文

数据库与缓存数据不一致的解决方法

  • 先更新数据库,后更新缓存
并发更新数据库场景下,会将脏数据写到缓存,因为缓存的读写速度要远远快于数据库
数据库中为2,缓存中是1
用户说我充值100,但过了一会儿用户说我充200吧,100有点少了,数据库更新成了200,缓存也更新成了200,但第一次请求写入缓后,缓存为100,下次访问的时候,缓存命中的是100,数据不一致
  • 先更新缓存,后更新数据库
  • 先删除缓存,再更新数据库
缺点是可能会导致缓存击穿,删除缓存后,如果大量请求访问该数据,会导致请求直接打到数据库,造成数据库压力读到脏值,例如:
A请求进行更新,B请求进行查询
A删除缓存,B查询时发现缓存中没有数据,会去数据库中查询,得到旧值
B将旧值写入缓存
A将新值写入数据库
解决方案:延时双删
先删除缓存,再更新数据库,延迟1s后再次删除缓存,确保再读请求之后,写请求可以删除读请求造成的脏数据
延时操作,性能下降怎么办?将第二次删除改为异步,用另一个线程进行删除
第二次删除失败怎么办?同步重试,异步消息队列(失败后,人工处理等),过期时间兜底
  • 先更新数据库,再删除缓存
优点:减少时间不一致的窗口
避免缓存击穿,即使缓存被删除,后续请求也会重新加载最新数据到缓存中
缺点:短暂不一致,更新数据库后,删除缓存前,读请求会读到缓存中的旧值
例如
A请求查询,B进行更新
A查询得到旧值
B将新值写入数据库
B删除缓存
A将旧值写入缓存
解决方案:
  • 异步延时删除
  • 加入重试机制
    • 方案一:消息队列重试
        • 更新数据库
        • 缓存删除失败(出现问题)
        • 将失败的key放入消息队列
        • 其他线程监听消息队列,获得需要删除的key
        • 重试删除操作,直到成功为止
      • 缺点:需要修改业务的代码逻辑,复杂难维护
    • 方案二:订阅binlog日志
        • 更新数据库数据
        • 订阅binlog日志(保存了数据库的变更记录),拿到具体要操作的数据
        • 执行缓存删除
http://www.xdnf.cn/news/702217.html

相关文章:

  • 动态规划题解——爬楼梯(力扣70 easy)
  • python几行命令实现快速打包apk
  • 卸载 Office PLUS
  • 贪心算法实战篇2
  • mimics导出图像 标注文件
  • 学习日记-day18-5.28
  • 央国企迁移国产数据库:数据迁移5步法与4项管理准则
  • GATED DELTA NETWORKS : IMPROVING MAMBA 2 WITH DELTA RULE
  • 【AI算法工程师面试指北】小球检测问题
  • 【Python-Day 19】函数的回响:深入理解 `return` 语句与返回值
  • 融智学视域下的多时空统一框架与信智序位法则
  • 基于CATIA参数化圆锥建模的自动化插件开发实践——NX建模之圆锥体命令的参考与移植(三)
  • 图神经网络在信息检索重排序中的应用:原理、架构与Python代码解析
  • ORB-SLAM2学习笔记:ORBextractor::operator()函数的逐行解析
  • 应用宝的NotificationManagerService_post_com.tencent.android.qqdownloader持锁现象
  • 涨薪技术|0到1学会性能测试第87课-Webservice接口性能测试
  • (nice!!!)(LeetCode 每日一题) 3372. 连接两棵树后最大目标节点数目 I (贪心+深度优先搜索dfs)
  • GPU时间与transformer架构计算量分析
  • qemu安装risc-V 64
  • springboot配置mybatis debug的sql日志输出
  • DelayQueue源码解析
  • 《活法》
  • Python实例题:Python实现FTP弱口令扫描器
  • 如何去除文章的AI痕迹2025新方法
  • DeepSeek 工作应用深度指南
  • 二叉树的锯齿形层序遍历——灵活跳跃的层次结构解析
  • 第十一节:第三部分:异常:异常的两种处理方式
  • 【Unity】自动生成围绕模型的路径点
  • 企业应如何构建用户画像系统
  • C语言Day9:C语言类型转换规则