【Redis】数据库与缓存一致性

news2025/6/9 22:55:47

目录

  • 1、背景
  • 2、核心问题
  • 3、常见解决方案
    • 【1】缓存更新策略
      • [1]旁路缓存模式(Cache-Aside)
      • [2]写穿透模式(Write-Through)
      • [3]写回模式
    • 【2】删除与更新策略
      • [1]先更新数据库再删除缓存
      • [2]先删除缓存再更新数据库
    • 【3】一致性保障机制
      • [1]双删策略
      • [2]消息队列补偿
      • [3]版本号/时间戳
  • 4、实际应用建议
  • 5、典型问题场景

1、背景

数据库与缓存一致性是指当数据同存在于数据库和缓存中时,如何确保两者数据保持同步,避免出现数据不一致的情况

2、核心问题

1、写入顺序问题:先更新数据库还是先更新缓存
2、并发操作问题:多个请求同时操作数据库和缓存
3、失败场景处理:操作过程中部分失败导致的不一致

3、常见解决方案

【1】缓存更新策略

[1]旁路缓存模式(Cache-Aside)

读取流程:

1、先查缓存,名字则返回
2、未命中则查数据库,写入缓存后返回

写入流程:

1、更新数据库
2、删除缓存

优点:

实现简单,缓存不负责数据加载

缺点:

首次请求必然穿透到数据库

[2]写穿透模式(Write-Through)

写入流程:

1、先更新缓存
2、缓存组件同步更新数据库

优点:

确保缓存和数据库强一致性

缺点:

写入延迟高

[3]写回模式

写入流程:

1、只更新缓存
2、异步批量更新数据库

优点:

写入性能高

缺点:

存在数据丢失风险

【2】删除与更新策略

[1]先更新数据库再删除缓存

1、更常用,减少脏数据窗口
2、但删除缓存失败会导致不一致

[2]先删除缓存再更新数据库

1、可能会导致"脏读"问题
2、读请求可能在删除后、更新前将旧数据加载到缓存

【3】一致性保障机制

[1]双删策略

1、先删除缓存
2、更新数据库
3、延迟一段时间后再次删除缓存

解决并发读导致的脏数据问题

[2]消息队列补偿

1、通过消息队列异步处理缓存更新
2、确保最终一致性

[3]版本号/时间戳

1、数据携带版本信息
2、只接受版本更高的更新

4、实际应用建议

1、根据业务需求选择策略:强一致性要求高的场景用写穿透模式,可接受最终一致性的用旁路缓存模式
2、设置合理的缓存过期时间:即使不一致也有自动恢复机制
3、监控和告警:即使发现不一致情况
4、考虑读写比例:读多写少适合旁路缓存模式,写多读少考虑写穿透模式

5、典型问题场景

1、缓存击穿后并发重建:使用互斥锁防止多个请求同时重建缓存
2、主从延迟:主库更新后从库可能还未同步,导致读取到旧数据
3、热点数据竞争:对热点key采样本地缓存或分布式锁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2405939.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Selenium4+Python的web自动化测试框架

一、什么是Selenium? Selenium是一个基于浏览器的自动化测试工具,它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分:Selenium IDE、Selenium WebDriver 和Selenium Grid。 Selenium IDE:Firefo…

【论文解读】MemGPT: 迈向为操作系统的LLM

1st author: Charles Packer paper MemGPT[2310.08560] MemGPT: Towards LLMs as Operating Systems code: letta-ai/letta: Letta (formerly MemGPT) is the stateful agents framework with memory, reasoning, and context management. 这个项目现在已经转化为 Letta &a…

vb监测Excel两个单元格变化,达到阈值响铃

需求 在Excel中实现监控两个单元格之间的变化范围,当达到某个设定的值的范围内时,实现自动响铃提示。 实现: 首先设置Excel,开启宏、打开开发者工具,点击visual Basic按钮,然后在左侧双击需要监测的shee…

node 进程管理工具 pm2 的详细说明 —— 一步一步配置 Ubuntu Server 的 NodeJS 服务器详细实录 7

前言 我以 Ubuntu Server 打造的 NodeJS 服务器为主题的系列文章,经过五篇博客,我们顺利的 安装了 ubuntu server 服务器,并且配置好了 ssh 免密登录服务器,安装好了 服务器常用软件安装, 配置好了 zsh 和 vim 以及 通过 NVM 安装…

Flask与Celery 项目应用(shared_task使用)

目录 1. 项目概述主要功能技术栈 2. 项目结构3. 环境设置创建虚拟环境并安装依赖主要依赖 4. 应用配置Flask应用初始化 (__init__.py)Celery应用初始化 (make_celery.py) 5. 定义Celery任务 (tasks.py)任务说明 6. 创建API端点 (views.py)API端点说明 7. 前端界面 (index.html)…

二叉树-226.翻转链表-力扣(LeetCode)

一、题目解析 翻转可以理解为树的左右子树交换,从根到叶子节点,但是这里交换的是链接的指针,而不是单纯的交换值,当出现nullptr时,也是可以交换链接的,交换值的话就不行了。 二、算法原理 依旧的递归&…

HarmonyOS Next 弹窗系列教程(3)

HarmonyOS Next 弹窗系列教程(3) 选择器弹窗 (PickerDialog) 介绍 选择器弹窗通常用于在用户进行某些操作(如点击按钮)时显示特定的信息或选项。让用户可以进行选择提供的固定的内容。 以下内容都属于选择器弹窗: …

【docker】Windows安装docker

环境及工具(点击下载) Docker Desktop Installer.exe (windows 环境下运行docker的一款产品) wsl_update_x64 (Linux 内核包) 前期准备 系统要求2: Windows 11:64 位系统&am…

无人机避障——感知部分(Ubuntu 20.04 复现Vins Fusion跑数据集)胎教级教程

硬件环境:NVIDIA Jeston Orin nx 系统:Ubuntu 20.04 任务:跑通 EuRoC MAV Dataset 数据集 展示结果: 编译Vins Fusion 创建工作空间vins_ws # 创建目录结构 mkdir -p ~/vins_ws/srccd ~/vins_ws/src# 初始化工作空间&#xf…

如何安装并使用RustDesk

参考: 搭建 RustDesk Server:打造属于自己的远程控制系统,替代 TeamViewer 和 ToDesk! 向日葵、ToDesk再见!自己动手,自建RustDesk远程服务器真香! 通俗易懂:RustDesk Server的搭…

机器学习——随机森林算法

随机森林算法是一种强大的树集成算法,比使用单个决策树效果要好得多。 以下是生成树集成的方法:假设有一个大小为m的训练集,然后对于b1到B,所以执行B次,可以使用有放回抽样来创建一个大小为m的训练集。所以如果有10个…

【从零学习JVM|第二篇】字节码文件

前言: 通过了解字节码文件可以帮助我们更容易的理解JVM的工作原理,所以接下来,我们来介绍一下字节码文件。 目录 前言: 正确的打开字节码文件 字节码文件组成 1. 魔数(Magic Number) 2. 版本号&…

Fractal Generative Models论文阅读笔记与代码分析

何恺明分型模型这篇文章在二月底上传到arXiv预出版网站到现在已经过了三个月,当时我也听说这篇文章时感觉是大有可为,但是几个月不知道忙啥了,可能错过很多机会,但是亡羊补牢嘛,而且截至目前,该文章应该也还…

OGG-01635 OGG-15149 centos服务器远程抽取AIX oracle11.2.0.4版本

背景描述 有一套ogg远程抽取的环境,源端是AIX7.1环境的oracle 11.2.0.4版本的数据库,中间是OGG抽取服务器,目标端是centos 7.9环境的oracle 19c。 采用集成模式远程抽取源端数据正常,但是经典模式远程抽取源数据的时候抽取进程启…

Kotlin REPL初探

文章目录 1. Kotlin REPL 简介2. 在命令行中玩Kotlin REPL2.1 下载Kotlin编译器压缩包2.2 安装配置Kotlin编译器2.3 启动Kotlin交互式环境2.4 在命令行玩Kotlin REPL 3. 在IDEA里玩Kotlin REPL3.1 打开Kotlin REPL窗口3.2 在Kotlin REPL窗口玩代码 4. Kotlin REPL 的优势 1. Ko…

git引用概念(git reference,git ref)(简化对复杂SHA-1哈希值的管理)(分支引用、标签引用、HEAD引用、远程引用、特殊引用)

文章目录 **引用的本质**1. **引用是文件**2. **引用的简化作用** **引用的类型**1. **分支引用(Branch References)**2. **标签引用(Tag References)**3. **HEAD 引用**4. **远程引用(Remote References)*…

Github 2025-06-07 Rust开源项目日报Top10

根据Github Trendings的统计,今日(2025-06-07统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Dart项目1TypeScript项目1RustDesk: 用Rust编写的开源远程桌面软件 创建周期:1218 天开发语言:Rust, Dart协议类型:GNU Affero Ge…

自动化立体仓库堆垛机控制系统STEP7 OB1功能块

1、堆垛机控制系统STEP7硬件组态如下图 CPU CPU 314C-2 PN/DP 6ES7 314-6EH04-0AB0 SM 338 POS-INPUT AO2x12Bit 6ES7 332-5HB01-0AB0 2、堆垛机控制系统STEP7内部变量 前进HMI M 0.0 BOOL 后退HMI M 0.1 BOOL 上升HMI M 0.2 B…

MATLAB生成大规模无线通信网络拓扑(任意节点数量)

功能: 生成任意节点数量的网络拓扑,符合现实世界节点空间分布和连接规律 效果: 30节点: 100节点: 500节点: 程序: %创建时间:2025年6月8日 %zhouzhichao %自然生长出n节点的网络% …

ubuntu 20.04挂载固态硬盘

我们有个工控机,其操作系统是ubuntu 20.04。可以接入一个固态硬盘。将固态硬盘插好后,就要进行挂载。在AI的指导下,过程并不顺利。记录如下: 1、检查硬盘是否被识别 安装好硬盘后,运行以下命令来检查Linux系统是否…