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

devtools/2024/11/30 13:46:44/

问题描述

应对策略

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

总结

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

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


http://www.ppmy.cn/devtools/138212.html

相关文章

从0开始学PHP面向对象内容之常用设计模式(享元)

二、结构型设计模式 7、享元模式(Flyweight Pattern) 这里是引用享元模式(Flyweight Pattern) 是一种结构型设计模式,旨在通过共享对象来减少内存使用,尤其适用于大量相似对象的场景。通过共享和重用对象的…

RabbitMQ学习-Seven

再SpringBoot中使用MQ 1.创建SpringBoot项目 除了我们平常使用的一些工具依赖,还需要选择这个Spring for RabbitMQ依赖 2.需要在application.yml文件中进行配置 server:port :9090 spring:application:name:producerrabbitmq:host: 你的主机名port: 5672virtual-…

DRM(数字权限管理技术)防截屏录屏----解密org.w3.clearkey视频并播放

提示:解密org.w3.clearkey视频并播放 帮助:未实现clearkey加密,如有大神,请指导一下 文章目录 [TOC](文章目录) 前言一、教程二、org.w3.clearkey视频播放三、效果四、问题总结 前言 ‌‌ClearKey‌是一种基于JSON Web Key (JWK)格…

网络安全构成要素

一、防火墙 组织机构内部的网络与互联网相连时,为了避免域内受到非法访问的威胁,往往会设置防火墙。 使用NAT(NAPT)的情况下,由于限定了可以从外部访问的地址,因此也能起到防火墙的作用。 二、IDS入侵检…

网络安全(1)_对称加密和非对称加密

1 网络安全概述 1.1 计算机网络面临的安全威协 (1)截获:攻击者从网络上窃听他人的通信内容,通常把这类攻击称为“截获”。在被动攻击中,攻击者只是观察和分析某一个协议数据单元(PDU)而不干扰信…

[Python/网络安全] Git漏洞之Githack工具基本安装及使用详析

前言 本文仅分享Githack工具基本安装及使用相关知识,不承担任何法律责任。 Git是一个非常流行的开源分布式版本控制系统,它被广泛用于协同开发和代码管理。许多网站和应用程序都使用Git作为其代码管理系统,并将其部署到生产环境中以维护其代…

基于单片机的智能药箱设计

本设计主要由红外检测传感器、显示、独立按键、舵机、语音以及短信等模块组成。红外传感器模块主要对药仓中的药物数据进行采集,采集完毕由主控制器进行数据加工,之后可传送至显示模块上进行显示,在显示模块也可对显示时间、吃药倒计时、吃药…

《软件项目管理》期末-复习题及参考答案

(1)赶工一个任务时,你应该关注( C ) A. 尽可能多的任务 B. 非关键任务 C. 加速执行关键路径上的任务 D. 通过成本最低化加速执行任务 (2)下列哪个不是项目管理计划的一部分?&#x…