分布式缓存:缓存的三种读写模式及分类

文章目录

  • 缓存全景图
  • Pre
  • 缓存读写模式概述
  • 1. Cache Aside(旁路缓存)
    • 工作流程
    • 优缺点
  • 2. Read/Write Through(读写穿透)
    • 工作流程
    • 优缺点
    • 典型场景
  • 3. Write Behind Caching(异步写回)
    • 工作流程
    • 优缺点
    • 典型场景
  • 缓存分类及常用组件
    • 1. 按宿主层次分类
    • 2. 按存储介质分类
  • 场景对比与权衡
  • 小结

在这里插入图片描述


缓存全景图

在这里插入图片描述


Pre

每日一博 - 图解5种Cache策略

架构思维:缓存层场景实战_读缓存(下)


缓存读写模式概述

在业务系统中,引入缓存主要为了降低数据库压力、提升响应性能,但也带来了数据一致性和维护成本的挑战。

根据缓存和数据库的更新策略,常见有三种读写模式:

  • Cache Aside(旁路缓存)

  • Read/Write Through(读写穿透)

  • Write Behind Caching(异步缓存写入)

在这里插入图片描述

下面逐一详细介绍。


1. Cache Aside(旁路缓存)

工作流程

在这里插入图片描述

  • 写操作

    1. 应用先更新数据库
    2. 删除 Cache 中对应的 key
    3. 由数据库变更日志或下游 Trigger 驱动重新计算并回写缓存
  • 读操作

    1. 应用先查询 Cache
    2. 若未命中,则加载数据库数据
    3. 将结果写入 Cache,并返回给调用方
写 ➔ Update DB ➔ DEL cache[key] 
读 ➔ GET cache[key] ➔ Miss ➔ Query DB ➔ SET cache[key] ➔ Return

优缺点

  • 优点

    • 以数据库为准,强一致性风险低
    • 缓存回写采用延迟(Lazy)计算,可灵活处理复杂业务
  • 缺点

    • 业务端需同时维护 Cache 和 DB 访问逻辑,代码复杂度高
    • 触发缓存回写依赖日志或 Trigger,增加组件依赖

2. Read/Write Through(读写穿透)

工作流程

由缓存存储服务(Cache Service)统一代理读写,业务应用只与存储服务交互。

在这里插入图片描述

如上图,对于 Cache Aside 模式,业务应用需要同时维护 cache 和 DB 两个数据存储方,过于繁琐,于是就有了 Read/Write Through 模式。在这种模式下,业务应用只关注一个存储服务即可,业务方的读写 cache 和 DB 的操作,都由存储服务代理。存储服务收到业务应用的写请求时,会首先查 cache,如果数据在 cache 中不存在,则只更新 DB,如果数据在 cache 中存在,则先更新 cache,然后更新 DB。而存储服务收到读请求时,如果命中 cache 直接返回,否则先从 DB 加载,回种到 cache 后返回响应。

  • 写操作

    1. 存储服务查 Cache
    2. 若命中,先更新 Cache,再同步写入 DB
    3. 若未命中,仅更新 DB
  • 读操作

    1. 存储服务查 Cache
    2. 命中则直接返回
    3. 未命中则加载 DB,然后回写 Cache,再返回
写 ➔ 存储服务(GET cache) ➔ Hit: SET cache + Update DB➔ Miss: Update DB
读 ➔ 存储服务(GET cache) ➔ Miss ➔ Load DB ➔ SET cache ➔ Return

优缺点

  • 优点

    • 业务端代码只关注存储服务,隔离性好
    • 仅为“热”数据更新缓存,内存利用率高
  • 缺点

    • 写路径较 Cache Aside 更同步,写延迟略高

典型场景

  • 有明显“热”与“冷”数据区分的业务

3. Write Behind Caching(异步写回)

工作流程

由缓存存储服务(Cache Service)统一代理读写,业务应用只与存储服务交互。

在这里插入图片描述

Write Behind Caching 模式与 Read/Write Through 模式类似,也由数据存储服务来管理 cache 和 DB 的读写。不同点是,数据更新时,Read/write Through 是同步更新 cache 和 DB,而 Write Behind Caching 则是只更新缓存,不直接更新 DB,而是改为异步批量的方式来更新 DB。该模式的特点是,数据存储的写性能最高,非常适合一些变更特别频繁的业务,特别是可以合并写请求的业务,比如对一些计数业务,一条 Feed 被点赞 1万 次,如果更新 1万 次 DB 代价很大,而合并成一次请求直接加 1万,则是一个非常轻量的操作。但这种模型有个显著的缺点,即数据的一致性变差,甚至在一些极端场景下可能会丢失数据。比如系统 Crash、机器宕机时,如果有数据还没保存到 DB,则会存在丢失的风险。所以这种读写模式适合变更频率特别高,但对一致性要求不太高的业务,这样写操作可以异步批量写入 DB,减小 DB 压力。

与 Read/Write Through 相似,均由存储服务管理:

  • 写操作

    1. 只更新 Cache
    2. 存储服务后台异步批量合并写 DB
  • 读操作
    同 Read/Write Through 模式

写 ➔ 存储服务(SET cache) ➔ Async Batch Write → DB
读 ➔ GET cache ➔ Miss ➔ Load DB ➔ SET cache ➔ Return

优缺点

  • 优点

    • 写性能最高,适合超高并发、可合并请求的场景
    • 如计数类业务,将多次加操作合并为一次 DB 更新
  • 缺点

    • 数据一致性最差,且在崩溃/宕机时可能丢失未刷盘的数据

典型场景

  • 对一致性要求不高,但写入频率极高的业务
  • 如热点计数、流量统计等

我们可以看到缓存的三种读写模式各有优劣,不存在最佳模式。实际上,我们也不可能设计出一个最佳的完美模式出来,如同空间换时间、访问延迟换低成本一样,高性能和强一致性从来都是有冲突的,系统设计从来就是取舍,随处需要 trade-off。

如何根据业务场景,更好的做 trade-off,从而设计出更好的服务系统。


缓存分类及常用组件

1. 按宿主层次分类

  • 本地 Cache(进程内):

    • 组件:Guava Cache、Ehcache(嵌入模式)
    • 优势:极低延迟、零网络开销;
    • 劣势:随进程重启丢失、容量受限。
  • 进程间 Cache(同机独立进程):

    • 组件:独立部署的 Redis/Memcached 实例(与业务进程同机)
    • 优势:重启不丢数据、减少部分网络延迟;
    • 劣势:本机资源竞争,运维较复杂。
  • 远程 Cache(跨机部署):

    • 组件:集群化的 Redis/Memcached/Pika
    • 优势:容量与扩展性最佳;
    • 劣势:网络延迟与带宽瓶颈。

2. 按存储介质分类

  • 内存型缓存

    • 数据驻留内存,读写延迟微秒级;
    • 重启或崩溃后数据丢失。
    • 典型:Memcached、Redis(无 AOF/RDB 时)。
  • 持久化型缓存

    • 数据写入 SSD/RocksDB 等介质,容量大一个量级;
    • 重启不丢失,但读写延迟高出 1–2 个数量级。
    • 典型:Pika、基于 RocksDB 的缓存方案。

场景对比与权衡

  • 一致性 vs. 性能

    • Cache Aside 最强一致性,Read/Write Through 次之,Write Behind 最弱;
  • 开发与运维成本

    • Cache Aside 代码最复杂,Read/Write Through 与 Write Behind 降低业务端复杂度;
  • 响应延迟与吞吐

    • Write Behind 写性能最高,Read/Write Through 读写均衡,Cache Aside 读性能最佳。

根据业务特性(访问热点、更新频度、一致性需求),在三种模式与不同部署/存储选型中做权衡,才能打造符合需求的缓存架构。


小结

我们树立了三种缓存读写模式——Cache Aside、Read/Write Through、Write Behind Caching——及其适用场景;

  • Cache Aside:业务先读写数据库、删除缓存,通过懒加载方式在下一次读时回填缓存,确保以数据库为准。
  • Read/Write Through:所有读写请求都由缓存服务统一代理,缓存命中则读写缓存并同步数据库,未命中则回源数据库并回填缓存。
  • Write Behind Caching:写操作只更新缓存,后台异步批量合并写入数据库,以最高写吞吐换取可容忍的数据一致性降低。

在这里插入图片描述

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

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

相关文章

Ntfs!FindFirstIndexEntry函数中ReadIndexBuffer函数的作用是新建一个Ntfs!_INDEX_LOOKUP_STACK结构

第一部分: 0: kd> kc # 00 Ntfs!FindFirstIndexEntry 01 Ntfs!NtfsRestartIndexEnumeration 02 Ntfs!NtfsQueryDirectory 03 Ntfs!NtfsCommonDirectoryControl 04 Ntfs!NtfsFsdDirectoryControl 05 nt!IofCallDriver 06 nt!IopSynchronousServiceTail 07 nt!Nt…

5.24 note

笛卡尔积(➕选择条件 select a.student_name as member_A, b.student_name as member_B, c.student_name as member_C from schoola as a join schoolb as b join schoolc as c where a.student_name ! b.student_name and a.student_name !…

为什么需要在循环里fetch?

假设有多个设备连接在后端,数量不定,需要按个读回状态,那么就要在循环里fetch了. 此函数非常好用,来自于国内一个作者,时间久了,忘记了来源,抱歉. export default async function fetchWithTimeout(resource, options {}) {const { timeout 1000 } options;const controll…

不同净化技术(静电 / UV / 湿式)的性能对比研究

在餐饮油烟和工业废气治理领域,油烟净化技术的选择至关重要。目前,静电、UV 光解、湿式洗涤是市场上应用较为广泛的三种净化技术。它们凭借不同的工作原理和技术特性,在净化效率、能耗、适用场景等方面展现出各自的优势与局限。本文将从多个维…

Ubuntu 22.04上升级npm版本

如果使用NVM安装Node.js npm会自动包含,但版本可能不是最新的。你可以选择升级: # 检查当前版本 npm --version# 升级到最新版本 npm install -g npmlatest# 或者升级到特定版本 npm install -g npm9.8.1如果使用其他方法安装Node.js 通常Node.js安装…

项目管理进阶:111页 详解华为业务变革框架及战略级项目管理【附全文阅读】

BTMS 是一套集成管理系统框架,涵盖变革规划、项目执行、实施及生命周期管理等多个关键环节。在规划阶段,通过全面收集需求、深入分析现状,制定出符合业务战略的年度规划,明确变革举措和项目清单。 解决方案开发的 PMOP 流程&#…

java基础知识回顾1(可用于Java基础速通)考前,面试前均可用!

目录 一、初识java 二、基础语法 1.字面量 2.变量 3.关键字 4.标识符 声明:本文章根据黑马程序员b站教学视频做的笔记,可对应课程听,课程链接如下: 02、Java入门:初识Java_哔哩哔哩_bilibili 一、初识java Java是美国 sun 公…

Linux下MySQL的安装与使用

1 安装前说明 1.1 Linux系统及工具的准备 安装并启动好两台虚拟机:CentOS 7 掌握克隆虚拟机的操作 mac地址主机名ip地址UUID 安装有 Xshell 和 Xftp 等访问 CentOS 系统的工具 CentOS6 和 CentOS7 在 MySQL 的使用中的区别 防火墙:6是iptables&am…

在react项目中使用andt日期组件,选择周和季度,直接获取所对应的日期区间

在react项目中使用andt日期组件,选择周和季度,直接获取所对应的日期区间 import { DatePicker, Space } from antd; import React from react; const onChange (date, dateString) > {console.log(date,dateString) }; const onChangeweek (date, …

数字信号处理大实验2 利用FFT估计信号的频率

目录 3.1 实验目的 3.2 实验内容与要求 3.3 实验原理 3.3.1 基于时域求导-频域乘法的n阶导数积分法 3.3.2 基于频域卷积的双/多谱线插值法 3.3.3 基于谱峰和滑动平均的多谱线综合插值方法 3.3.4 基于相邻显著谱线的滑动平均综合插值方法 3.3.5 基于(2&#…

【Java】Java元注解

Target(ElementType.METHOD) Retention(value RetentionPolicy.RUNTIME) public interface OperatorLog {String source() default "WEB"; //日志操作来源 默认是web,还有socket的String model() default ""; //操作模块 }这个代码中的 Target…

阿里云百炼(1) : 阿里云百炼应用问答_回答图片问题_方案1_提问时上传图片文件

直接用于拍照答题不大理想, 可能适用其他用途, 更好的方案: 阿里云百炼(1) : 阿里云百炼应用问答_回答图片问题_方案2_提取题目再提问-CSDN博客 1.实现代码 package cn.nordrassil.ly.test.拍照答题;import com.alibaba.dashscope.app.Application; import com.alibaba.dashsc…

深入探索 CSS 中的伪类:从基础到实战​

在前端开发的世界里,CSS 作为网页样式的 “化妆师”,有着至关重要的作用。而 CSS 伪类则像是这位 “化妆师” 手中的神奇画笔,能够基于元素的状态或位置为其添加独特的样式,极大地丰富了网页的交互性和视觉效果。接下来&#xff0…

c++ constexpr关键字

constexpr字面意思为常量表格式, 用于指示编译器在编译时计算表达式的值。 1、作为常量表格式,必须在编译时就能确定其值。如:constexpr int size 9527; 2、可以修饰函数,要求能在编译时求值,所以传的参数也必须是编…

服务器硬盘分类

以下是服务器硬盘的综合性分类与技术特性分析,依据当前行业标准及技术演进整理: 一、按存储介质分类 1. ‌机械硬盘(HDD)‌ ‌ 核心特性‌:采用旋转磁盘与机械磁头结构,通过磁道寻址实现数据读写 …

图解深度学习 - 机器学习简史

前言 深度学习并非总是解决问题的最佳方案:缺乏足够数据时,深度学习难以施展;某些情况下,其他机器学习算法可能更为高效。 若初学者首次接触的是深度学习,可能会形成一种偏见,视所有机器学习问题为深度学…

ConceptAttention:Diffusion Transformers learn highly interpretable features

ConceptAttention: Diffusion Transformers Learn Highly Interpretable Featureshttps://arxiv.org/html/2502.04320?_immersive_translate_auto_translate=1用flux的attention来做图文的显著性分析。 1.i

【Python正则表达式终极指南】从零到工程级实战

目录 🌟 前言🏗️ 技术背景与价值🩹 当前技术痛点🛠️ 解决方案概述👥 目标读者说明 🧠 一、技术原理剖析📊 核心概念图解💡 核心作用讲解🔧 关键技术模块说明⚖️ 技术选…

C++对象的内存模型

C++对象的内存模型涉及对象的数据成员(包括静态成员和非静态成员)、成员函数以及虚函数表等在内存中的布局和管理方式。以下是C++对象的内存模型的主要组成部分: 1. C++对象的组成 一个C++对象通常由以下几个部分组成: 非静态数据成员 对象的核心组成部分,每个对象都有自己…

hugging-face数据集快速下载

开发机配置外网代理并使用 git lfs 高速下载 Hugging Face 数据集流程 本文档将介绍如何配置开发机的代理,登录 Hugging Face,并使用 git-lfs (Git Large File Storage)进行数据集的高速下载。 1. 配置代理连接外网 开发机在某些…