緩存(2):數據一致性

概述

一致性就是數據保持一致,在分布式系統中,可以理解為多個節點中數據的值是一致的

  • 強一致性:這種一致性級別是最符合用戶直覺的,它要求系統寫入什么,讀出來的也會是什么用戶體驗好,但實現起來往往對系統的性能影響大
  • 弱一致性:這種一致性級別約束了系統在寫入成功后,不承諾立即可以讀到寫入的值也不承諾多久之后數據能夠達到一致,但會盡可能地保證到某個時間級別(比如秒級別)后,數據能夠達到一致狀態
  • 最終一致性:最終一致性是弱一致性的一個特例,系統會保證在一定時間內,能夠達到一個數據一致的狀態。這里之所以將最終一致性單獨提出來,是因為它是弱一致性中非常推崇的一種一致性模型,也是業界在大型分布式系統的數據一致性上比較推崇的模型

緩存可以提升性能、緩解數據庫壓力,但是使用緩存也會導致數據不一致性的問題。

三種經典的緩存模式

三種經典的緩存模式

  • Cache-Aside Pattern:旁路緩存模式
  • Read-Through/Write through:讀寫穿透
  • Write behind:異步緩存寫入

Cache-Aside Pattern(旁路緩存模式)

Cache-Aside Pattern,即旁路緩存模式,它的提出是為了盡可能地解決緩存與數據庫的數據不一致問題

讀請求流程如下:

  • 讀的時候,先讀緩存,緩存命中的話,直接返回數據;
  • 緩存沒有命中的話,就去讀數據庫從數據庫取出數據,放入緩存后,同時返回響應
    在這里插入圖片描述

寫請求流程如下:

  • 更新的時候,先更新數據庫,然后再刪除緩存
    在這里插入圖片描述

問題

為什么這是直接刪除緩存?

如果是更新的話,會有下述幾個缺點

  • 會出現數據不一致問題,假設:
    • 線程A先發起一個寫操作,第一步先更新數據庫;
    • 線程B再發起一個寫操作,第二步更新了數據庫
    • 由于網絡等原因,線程B先更新了緩存, 線程A更新緩存
    • 這時候,緩存保存的是A的數據(老數據),數據庫保存的是B的數據(新數據),數據不一致了,臟數據出現
    • 這時候,如果是刪除緩存取代更新緩存則不會出現這個臟數據問題
  • 如果你寫入的緩存值,是經過復雜計算才得到的話。 更新緩存頻率高的話,就浪費性能
  • 寫多讀少的情況下,數據很多時候還沒被讀取到,又被更新了,這也浪費了性能

但是如果是更新緩存的話,在讀多寫少的場景,價值大

為什么先操作數據庫后操作緩存

假設有A、B兩個請求,請求A做更新操作,請求B做查詢讀取操作。

如果是先操作緩存的話,A、B兩個請求的操作流程如下:

  1. 線程A發起一個寫操作,第一步del cache
  2. 此時線程B發起一個讀操作,cache miss
  3. 線程B繼續讀DB,讀出來一個老數據
  4. 然后線程B把老數據設置入cache
  5. 線程A寫入DB最新的數據

如果是先操作緩存的話便會出現:緩存保存的是老數據,數據庫保存的是新數據

因此,Cache-Aside緩存模式,選擇了先操作數據庫而不是先操作緩存。

數據不一致情況

情況的核心是
線程1:DB寫操作和刪除緩存在事務中,刪除緩存后,事務還未提交。
線程2:緩存已經刪除,從DB讀后,寫入緩存。
由于線程1的事務未提交,線程2讀取并放入緩存的的還是舊數據,導致數據最終不一致

但,這個case理論上會出現,不過,實際上出現的概率可能非常低,因為這個條件需要發生在讀緩存時緩存失效,而且并發著有一個寫操作

實際上數據庫的寫操作會比讀操作慢得多,而且還要鎖表,而讀操作必需在寫操作前進入數據庫操作,而又要晚于寫操作更新緩存,所有的這些條件都具備的概率基本并不大
所以,要么通過2PC或是Paxos協議保證一致性要么就是拼命的降低并發時臟數據的概率
而Facebook使用了這個降低概率的玩法,因為2PC太慢,而Paxos太復雜

當然,最好還是為緩存設置上過期時間。

解決方案: 刪除緩存,做2次刪除

  1. 直接刪除;
  2. 注冊事務回調,事務結束(提交或回滾)后再次刪除

Read-Through/Write through(讀寫穿透)

Read/Write Through模式中,服務端把緩存作為主要數據存儲應用程序跟數據庫緩存交互,都是通過抽象緩存層完成的

  • 可以理解為,應用認為后端就是一個單一的存儲,而存儲自己維護自己的Cache

Read-Through實際只是在Cache-Aside之上進行了一層封裝,它會讓程序代碼變得更簡潔,同時也減少數據源上的負載。
Read-Through讀流程如下

  • 從緩存讀取數據,讀到直接返回
  • 如果讀取不到的話,從數據庫加載,寫入緩存后,再返回響應

流程如下所示

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/80224.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80224.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/80224.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CH579 CH573 CH582 CH592 藍牙主機(Central)實例應用講解

藍牙主機(Central),顧名思義,就是一個藍牙主設備,與從機(Peripheral)建立連接進行通信,可以接收從機通知,也可以給從機發送信息,通常Central和Peripheral結合…

不同類型的 SAP 項目

目錄 1 實施項目 2 SAP S/4 HANA 升級項目 3 數據遷移項目 4 優化項目 5 Rollout 項目 6 運維項目 1 實施項目 企業第一次用 SAP 系統,從硬件搭建到安裝 SAP、根據業務流程做配置、開發、培訓業務、測試系統直到系統上線。 SAP S/4 HANA ACTIVATE 實施方法論…

【uniapp】errMsg: “navigateTo:fail timeout“

項目場景: 在點擊編輯的時候不能跳轉的編輯的頁面,然后直接報錯errMsg: "navigateTo:fail timeout" 解決方案: 看看是否是出現了盒子的冒泡事件導致了兩次調用跳轉路徑 tap.stop

記錄學習的第三十五天

今天主攻單源最短路Dijkstra算法。不過,還是沒有完全掌握。 首先是書本的例題我理解了一遍。 然后其實在力扣上做了三道題的,但是我看題解的情況就不太會。然后試著用上面的方法敲了一下↓的題,但是不對啊,我也不知道為什么呀。

Spring-博客系統項目

一,實現效果 登錄: 注冊: 博客列表 個人博客中心 博客詳情: 更新博客 編寫博客 二,數據庫的建立和連接 首先,需要建庫,需要兩個實體,一個是用戶,一個是博客,需要如下屬性,需要注意的是需要將密碼的變長字符創設置的長一些,因為之后會對用戶的密碼進行加密,該博客中密碼…

依賴注入詳解與案例(前端篇)

依賴注入詳解與案例(前端篇) 一、依賴注入核心概念與前端價值 依賴注入(Dependency Injection, DI) 是一種通過外部容器管理組件/類間依賴關系的設計模式,其核心是控制反轉(Inversion of Control, IoC&…

diy裝機成功錄

三天前,我正式開啟了這次裝機之旅,購入了一顆性能強勁的 i5-12400 CPU,一塊繪圖能力出色的 3060ti 顯卡,還有技嘉主板、高效散熱器、16G 內存條、2T 固態硬盤,以及氣派的機箱和風扇,滿心期待能親手打造一臺…

計算機三大主流操作系統的前世今生 - Linux|macOS|Windows

全文目錄 1 引言2 起源之路2.1 Linux 起源2.2 macOS 起源2.3 Windows 起源 3 綜合解析3.1 Linux系統綜合解析3.1.1 系統定義與核心架構3.1.2 發展歷程3.1.3 核心特點3.1.4 主流發行版3.1.5 應用場景 3.2 macOS系統綜合解析3.2.1 系統定義與核心架構3.2.2 發展歷程3.2.3 核心特點…

【AI智能推薦系統】第七篇:跨領域推薦系統的技術突破與應用場景

第七篇:跨領域推薦系統的技術突破與應用場景 提示語:?? “打破數據孤島,實現1+1>2的推薦效果!深度解析美團、亞馬遜如何用跨領域推薦技術實現業務協同,知識遷移核心技術全公開!” 目錄 跨領域推薦的商業價值跨領域推薦技術體系 2.1 基于共享表征的學習2.2 遷移學習…

R 語言科研繪圖 --- 桑基圖-匯總

在發表科研論文的過程中,科研繪圖是必不可少的,一張好看的圖形會是文章很大的加分項。 為了便于使用,本系列文章介紹的所有繪圖都已收錄到了 sciRplot 項目中,獲取方式: R 語言科研繪圖模板 --- sciRplothttps://mp.…

LintCode第485題-生成給定大小的數組,第220題-冰雹猜想,第235題-分解質因數

第485題 描述 給你一個大小size,生成一個元素從1 到 size的數組 樣例 1:輸入: size 4輸出: [1, 2, 3, 4]樣例解釋: 返回一個順序填充1到4的數組。樣例 2:輸入: size 1輸出: [1]樣例解釋: 返回一個順序填充1到1的數組 代碼如下: public class Solution { /** * param s…

Pandas:數據處理與分析

目錄 一、Pandas 簡介 二、Pandas 的安裝與導入 三、Pandas 的核心數據結構 (一)Series (二)DataFrame 四、Pandas 數據讀取與寫入 (一)讀取數據 (二)寫入數據 五、數據清洗…

Linux云計算訓練營筆記day05(Rocky Linux中的命令:管道操作 |、wc、find、vim)

管道操作 | 作用: 將前面命令的輸出,傳遞給后面命令,作為后面命令的參數 head -3 /etc/passwd | tail -1 取第三行 head -8 /etc/passwd | tail -3 | cat -n 取6 7 8行 ifconfig | head -2 | tail -1 只查看IP地址 ifconfig | grep 192 過濾192的ip…

動態規劃:最長遞增子序列

給定一個數組,求最長遞增子序列的長度,就是要求我們求出一個序列中最長的上升子序列的長度,最長上升子序列的定義就是從原序列中按照孫旭去除一些數字,這些數字是逐漸增大的。 *定義dp[i]表示以第i個元素結尾的最長上升子序列的長度。 *初始…

湖北理元理律師事務所:債務優化如何實現還款與生活的平衡?

債務壓力往往讓債務人陷入“還款還是生存”的兩難選擇。湖北理元理律師事務所通過案例實踐發現,科學規劃的核心在于平衡法律義務與基本生活保障,而非單純追求債務縮減。本文結合實務經驗,解析債務優化的可行路徑。 剛性需求優先:…

重力場模型、球諧函數以及重力異常

地球重力場有兩種表達方法: 1、拉普拉斯(Laplace)方法,將重力場展開為球諧級數。 2、斯托克斯(Stokes)方法,根據地球的總質量和旋轉角速度計算。 本篇主要說第一種方法,該方法將地…

MySQL的視圖

一、MySQL視圖的介紹和作用 MySQL視圖,加油兄弟們,孰能生巧,完整代碼在最后!!! 視圖是一個虛擬的表,并不是真是存在的,視圖其實并沒有真實的數據,他只是根據一個sql語句…

Scala與Go的異同教程

當瑞士軍刀遇到電鋸:Scala vs Go的相愛相殺之旅 各位準備禿頭的程序猿們(放心,用Go和Scala不會加重你的發際線問題),今天我們來聊聊編程界的"冰與火之歌"——Scala和Go的異同。準備好瓜子飲料,我…

SaaS場快訂平臺項目說明【持續更新】

一、項目介紹 SaaS場快訂平臺是一個高效、便捷的體育場館在線預訂平臺。本項目采用SaaS方式開發,用戶不需要安裝軟件,直接通過互聯網訪問在線程序即可使用。本項目主要構建了一個體育館預訂系統,項目的功能主要包括:用戶注冊與登…

linux中常用的命令(三)

目錄 1- ls(查看當前目錄下的內容) 2- pwd (查看當前所在的文件夾) 3- cd [目錄名](切換文件夾) 4- touch [文件名] (如果文件不存在,新建文件) 5- mkdir[目錄名] (創建目錄) 6-rm[文件名]&…