数据库和缓存的数据一致性 -20241124

ops/2024/11/29 4:20:18/

问题描述

应对策略

  • 缓存分成读写缓存和只读缓存
    • 只读缓存:只在缓存进行数据查找,即使用“更新数据库+删除缓存”策略。
      • 新增数据时,直接写入数据库
      • 更新(修改/删除)数据时,先删除缓存
      • 后续访问这些增删改的数据时,会发生缓存缺失,进而查询数据库,更新缓存
      • 文中提到无并发情况下,若步骤二失败会有一致性问题。
        • 可以采用消息队列,异步重试。(多次失败后通知业务层)
        • 也可采用binlog变更日志,根据日志更新/删除缓存
      • 并发条件下
        • 先删除缓存,再更新数据库(其他线程在缓存为空时访问数据库获得旧值,顺便将缓存更新了,造成缓存中的值在A线程完成更新数据库后也不再更新)
          • 设置缓存过期时间。淘汰缓存失败时,过期后,读请求从db中获取数据,并更新缓存。(?删除缓存可能会失败,设置超时时间就保证能成功了?)
          • 延迟双删:更新完数据库后,等待一段时间(使确保其他线程能读到修改后的值),再删除缓存
        • 先更新数据库,再删除缓存(线程B读到旧值,?感觉问题不大;若有从库,会尝试去从库拿?,由于主从库的延迟,造成缓存中保存的是从库中的旧值)
          • 延迟消息:发送删除缓存的消息到队列,延迟处理。如有必要,考虑主从数据库延迟
          • 通过数据库的binlog来异步删除缓存
          • 先更新数据库再删除缓存,有可能导致请求因缓存缺失而访问数据库,给数据库带来压力,也就是缓存穿透的问题。针对缓存穿透问题,可以用缓存空结果、布隆过滤器进行解决
          • 加锁:更新数据时,加写锁;查询数据时,加读锁
    • 读写缓存:需要在缓存中对数据进行增删改查,即使用“更新数据库+更新缓存”策略
      • 同步直写:使用事务,保证缓存和数据更新的原子性,并进行失败重试
      • 异步回写:写缓存时不同步写数据库,等到数据从缓存中淘汰时,再写回数据库
    • 重点考虑更新数据库缓存的顺序,读写还是读读
      • 对于读写场景,延迟消息比较,发现不一致后,做业务补偿(加延迟时间?)
      • 对于,写写场景,配合分布式锁处理。对于同一资源的操作,需要获取分布式锁,未获得锁的放在队列中。

总结

  • 数据库缓存存在不一致性,部分原因是因为数据库缓存是独立的两部分。从设计上可能做了适配,但是总归有配合问题。如果数据库本身在设计上就考虑设计高并发缓存,我们在使用时就不用考虑一致性问题或者性能问题。
    • 如人为设置一个等待时间,在数据库应该能完成数据更新的时,进行缓存的删除。如果数据库缓存是一体的,可能在内部就能完成,数据库完成删除后通知缓存更新。这样效率肯定比外界干预的两部效率要高
  • 性能和准确性的取舍在因场景而异,我们只能采用该架构下我们认知中,在该场景下,在有限的时间内能够完成的最优方案。

参考:https://cloud.tencent.com/developer/article/1888803


http://www.ppmy.cn/ops/137558.html

相关文章

探索 Vue的nextTick :原理剖析、使用场景及代码实践详解

在 Vue 中,$nextTick 是一个非常有用的 API,主要用于在 DOM 更新完成后执行一些操作。它可以确保某些代码在 Vue 完成数据更新和 DOM 渲染后再执行,从而避免因更新延迟导致的问题。 1. $nextTick 的作用 $nextTick 的作用是延迟执行一个回调函数,直到 DOM 更新完成。这通…

Linux系统性能优化技巧

系统性能优化 在当今的信息技术领域,Linux系统的性能优化变得越来越重要。随着Linux操作系统的广泛应用,从桌面环境到大型服务器集群,性能优化不仅可以提升系统的响应速度和吞吐量,还能降低资源消耗,从而延长硬件使用…

【深度学习之回归预测篇】 深度极限学习机DELM多特征回归拟合预测(Matlab源代码)

深度极限学习机 (DELM) 作为一种新型的深度学习算法,凭借其独特的结构和训练方式,在诸多领域展现出优异的性能。本文将重点探讨DELM在多输入单输出 (MISO) 场景下的应用,深入分析其算法原理、性能特点以及未来发展前景。 1、 DELM算法原理及其…

大模型并行:TP, PP, DP,MP

目录 大模型并行:TP, PP, DP,MP 张量并行(TP) 数据并行(DP) 模型并行(MP) 流水线并行(PP) TP:张量模型并行 一、定义与基本原理 二、切分方式 三、主要优势与挑战 优势 挑战 四、应用场景 五、注意事项 大模型并行:TP, PP, DP,MP 数据并行(Data Pa…

2024 年河北省职业院校技能大赛网络建设与运维赛项样题五

2024 年河北省职业院校技能大赛网络建设与运维赛项 赛题 赛题说明 一、竞赛项目简介 “网络建设与运维”竞赛共分为模块一:网络理论测试&#x

蓝桥杯练习题

目录 1.劲舞团 2.数字诗意 3.封闭图形个数 4.回文数组 欢迎 1.劲舞团 0劲舞团 - 蓝桥云课 #include <iostream> using namespace std; int main() {int num1,M0;long long c[1000000];int cnt0;string a,b ;while(cin>>a>>b>>c[cnt])//系统自动输入…

【VUE】el-table表格内输入框或者其他控件规则校验实现

1、封装组件 1、规则校验一般基于form表单实现&#xff0c;因此需要给具体控件套一层form表单 新建组件input-required.vue&#xff0c;内容如下 <template><div><el-form ref"formRef" :model"form" :rules"formRules" label-…

Java常见的锁策略

目录 Java常见的锁策略悲观锁和乐观锁轻量级锁和重量级锁自旋锁和挂起等待锁普通互斥锁和读写锁公平锁和非公平锁可重入锁和不可重入锁Java中的synchronized算哪种情况&#xff1f;系统原生的锁算哪种情况&#xff1f;synchronized的加锁过程&#xff0c;尤其是“自适应”是咋回…