分布式緩存:緩存的三種讀寫模式及分類

文章目錄

  • 緩存全景圖
  • 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
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84192.shtml
英文地址,請注明出處:http://en.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. 配置代理連接外網 開發機在某些…