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

缓存、数据库双写一致性解决方案

双写一致性问题的核心是确保数据库和缓存之间的数据同步,以避免缓存与数据库数据不同步的问题,尤其是在高并发和异步环境下。本文将探讨双写一致性面临的主要问题和解决方案,重点关注最终一致性。

本文讨论的是最终一致性问题

双写一致性面临的主要问题

 1、数据库和缓存非同一事务

在实际应用中,数据库和缓存通常不在同一个事务中执行,导致两者更新的顺序和时机不同。如果在某一操作过程中发生异常,可能导致数据库和缓存的数据不一致。

例如:

  • 先写缓存,再写数据库:如果写数据库失败,缓存可能已经更新,导致数据不一致。

  • 先写数据库,再写缓存:如果写缓存失败,数据库可能已经更新,导致缓存数据过期或失效。

  • 先删缓存,再写数据库:如果在删除缓存后发生异常,读取缓存时可能重新写入旧数据,导致一致性问题。

2、并发写入顺序不一致

在高并发场景下,多个线程或请求可能同时修改缓存和数据库,导致写入顺序不一致。例如,线程1先更新了数据库但未更新缓存,线程2先更新了数据库和缓存,最后线程1才更新缓存,导致缓存和数据库之间的顺序不一致。

例如:

  • 先写缓存,再写数据库

  • 先写数据库,再写缓存

3、先删缓存后写数据库的问题

这种策略常见于保证缓存数据失效的情况,但如果删除缓存操作和更新数据库操作之间的时间差过长,可能会导致“旧值回填”问题。

具体问题是:在删除缓存后,数据库未更新前,如果有读请求到达,系统会从数据库读取旧数据并写入缓存,导致缓存和数据库数据不一致。

解决双写一致性问题的方案

1、延迟双删

第一次删除缓存:数据库更新成功后立即进行。

延迟一段时间后再次尝试删除缓存,以防止旧值回填。

该方法虽然有效,但如果第二次删除失败,仍可能造成数据不一致。

2、增强版延迟双删+重试机制

对于删除缓存失败的情况,采用重试机制。

  • 方案1:直接重试删除操作。

  • 方案2:通过消息队列(MQ)异步推送删除操作,避免同步操作对性能的影响。

3、监听数据库binlog异步删除缓存

利用数据库的binlog(日志文件)机制,在数据更新后通过消费者异步删除缓存。

  • 优点:避免了删除缓存与更新数据库操作的同步性问题,提升了系统的可靠性。

  • 缺点:需要额外的基础设施来支持binlog监听和缓存删除。

最终保障:

对于长时间未能成功删除的情况,考虑状态升级,必要时进行人工干预。

一致性

1. 强一致性
  • 所有节点始终访问到相同的最新数据,数据更新后,所有读操作立即返回最新数据。

  • 适用于用户对一致性要求极高的场景,但可能会牺牲系统的性能。

2. 弱一致性 
  • 系统允许数据更新后短时间内存在延迟,不同节点可能在短期内不同步,直到最终一致性达到。

  • 提高了性能,但用户感知的实时性较差。

3. 最终一致性
  • 数据在一段时间后最终达到一致,即使没有新的更新操作,所有节点的状态会逐步同步。

  • 常用于分布式系统中,尤其适用于大规模、高并发的场景。

http://www.lryc.cn/news/523365.html

相关文章:

  • SUnet: A multi-organ segmentation network based on multiple attention【医学图像分割】
  • uniapp实现“到这儿去”、拨打电话功能
  • 2025年入职/转行网络安全,该如何规划?网络安全职业规划
  • 【博客之星】2024年度个人成长、强化学习算法领域总结
  • HTML5 Canvas实现的跨年烟花源代码
  • 使用通用预训练范式为 3D 基础模型铺平道路
  • SpringMVC (2)
  • 【Vim Masterclass 笔记16】S07L32 + L33:同步练习09 —— 掌握 Vim 宏操作的六个典型案例(含点评课内容)
  • 爬楼梯问题(Leetcode 第70题)
  • 6.5 正定矩阵
  • verilog笔记1
  • 游戏引擎学习第81天
  • git系列之revert回滚
  • 监控与调试:性能优化的利器 — ShardingSphere
  • LLVM - 编译器前端 - 理解BNF(巴科斯-诺尔范式)
  • 服务化架构 IM 系统之应用 MQ
  • ELF2开发板(飞凌嵌入式)基本使用的搭建
  • Appium(四)
  • 简单的sql注入 buuctf
  • Ubuntu 24.04 LTS 空闲硬盘挂载到 文件管理器的 other locations
  • <电子幽灵>开发笔记:BAT基础笔记(一)
  • PiliPalaX ( 第三方安卓哔哩哔哩)
  • 在亚马逊云科技上高效蒸馏低成本、高精度的Llama 3.1 405B模型(上篇)
  • Amazon MSK 开启 Public 访问 SASL 配置的方法
  • LeetCode_438.找到字符串中所有字母异位词
  • 一文读懂服务器的HBA卡
  • Debezium日常分享系列之:对于从Oracle数据库进行快照的性能优化
  • 深度学习 Pytorch 基本优化思想与最小二乘法
  • C# 实现系统信息监控与获取全解析
  • Transformer详解:Attention机制原理