【聊透SpringMVC】java技術經理崗位職責

緩存維護方案一

如果是一讀(線程B)一寫(線程A)操作,「先操作緩存,再操作數據庫」。流程圖如下所示:

  • 1.線程A發起一個寫操作,第一步del cache

  • 2.線程A第二步寫入新數據到DB

  • 3.線程B發起一個讀操作,cache miss緩存失效了。

  • 4.線程B從DB獲取最新數據

  • 5.線程B執行set cache,把從DB讀到的數據,更新到緩存。

「這樣看,沒啥問題」。我們再看第二個流程圖,如下:

  • 1.線程A發起一個寫操作,第一步del cache

  • 2.此時線程B發起一個讀操作,cache miss

  • 3.線程B繼續讀DB,讀出來一個老數據

  • 4.然后老數據設置入cache

  • 5.線程A寫入DB最新的數據

OK,醬紫,就有問題了吧,老數據入到緩存了,「每次讀都是老數據啦,緩存與數據與數據庫數據不一致了」

緩存維護方案二

上個方案是一讀一寫,如果是雙寫操作,「先操作緩存,再操作數據庫」,會怎么樣呢?

  • 1.線程A發起一個寫操作,第一步set cache

  • 2.線程A第二步寫入新數據到DB

  • 3.線程B發起一個寫操作,set cache

  • 4.線程B第二步寫入新數據到DB

「這樣看,也沒啥問題。」,但是有時候可能事與愿違,我們再看第二個流程圖,如下:

  • 1.線程A發起一個寫操作,第一步set cache

  • 2.線程B發起一個寫操作,第一步set cache

  • 3.線程B寫入數據庫到DB

  • 4.線程A寫入數據庫到DB

執行完后,緩存保存的是B操作后的數據,數據庫是A操作后的數據,「緩存和數據庫數據不一致」

緩存維護方案三

一寫(線程A)一讀(線程B)操作,「先操作數據庫,再操作緩存」

  • 1.線程A發起一個寫操作,第一步write DB

  • 2.線程A第二步del cache

  • 3.線程B發起一個讀操作,cache miss

  • 4.線程B從DB獲取最新數據

  • 5.線程B同時set cache

「有些朋友可能認為,在第2步刪除緩存之前,線程B讀過來呢?這時候,讀到的是緩存老數據,這個可以認為是正常業務邏輯呀,下次再讀取就是正確數據了。」

這種方案**「沒有明顯的并發問題」,但是有可能「步驟二刪除緩存失敗」,雖然概率比較小,「優于方案一和方案二」**,平時工作中也是使用方案三。

綜上對比,我們一般采用方案三,但是有沒有完美全解決方案三的弊端的方法呢?

緩存維護方案四

這個是方案三的改進方案,都是先操作數據庫再操作緩存,我們來看一下流程圖:

通過數據庫的**「binlog」「異步淘汰key」,以mysql為例 可以「使用阿里的canal將binlog日志采集發送到MQ隊列」里面,然后「通過ACK機制 確認處理」** 這條更新消息,刪除緩存,保證數據緩存一致性。

但是呢還有個問題,「如果是主從數據庫呢」

緩存維護方案五

主從DB問題:因為主從DB同步存在延時時間。如果刪除緩存之后,數據同步到備庫之前已經有請求過來時,「會從備庫中讀到臟數據」,如何解決呢?解決方案如下流程圖:

緩存維護總結

綜上所述,在分布式系統中,緩存和數據庫同時存在時,如果有寫操作的時候,「先操作數據庫,再操作緩存」。如下:

  • 1.讀取緩存中是否有相關數據
  • 2.如果緩存中有相關數據value,則返回
  • 3.如果緩存中沒有相關數據,則從數據庫讀取相關數據放入緩存中key->value,再返回
  • 4.如果有更新數據,則先更新數據庫,再刪除緩存
  • 5.為了保證第四步刪除緩存成功,使用binlog異步刪除
  • 6.如果是主從數據庫,binglog取自于從庫
  • 7.如果是一主多從,每個從庫都要采集binlog,然后消費端收到最后一臺binlog數據才刪除緩存

最后

作為過來人,小編是整理了很多進階架構視頻資料、面試文檔以及PDF的學習資料,針對上面一套系統大綱小編也有對應的相關進階架構視頻資料,如果**‘你’確定好自己未來的道路或者想學習提升自己技術棧、技術知識的小伙伴們可以點擊這里來獲取免費學習資料提升自己(全套面試文檔、PDF、進階架構視頻)**


va-p7)提升自己(全套面試文檔、PDF、進階架構視頻)**

[外鏈圖片轉存中…(img-uMgL2rKO-1626688897205)]
[外鏈圖片轉存中…(img-carA01Nh-1626688897205)]

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

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

相關文章

【聊透SpringMVC】自學java和三大框架要多久

餓了么一面(Java) hashmap源碼問題 HashMap底層結構 put操作講一下 HashMap、HashMap如何保證線程安全、ConcurrentHashMap JVM有哪些回收算法,對應的收集器有哪些? jvm g1的內存模型講一下,G1和CMS收集器的區別&#…

【設計思想解讀開源框架】mysql官方文檔中文版下載免費

01 源碼分析 源碼閱讀,最核心有三點:技術基礎強烈的求知欲耐心。 1.1 設計模式(45設計模式:介紹優缺點應用實例源代碼解決問題) 1.2 Spring復習大綱:依賴注入IocBeans注解數據訪問AOPMVC等 1.3 Spring全家…

命令新參

命令形參: 命令行參數是使用main()函數參數來處理的,其中,argc是指傳入參數的個數,argv[]是一個指針數組,指向傳遞給程序的每個參數。 應當指出的是, argv[0]存儲程序的名稱,argv[1]是一個指向…

【金三銀四】啟動mysql服務器

微服務架構 ①微服務概念: ②Spring Cloud微服務架構: 海量數據處理 ①:經典的海量數據處理面試題 高可用架構 ①基于 Hystrix 實現高可用: ②限流: ③熔斷: 高并發架構 ①消息隊列: ②搜索…

函數fork vfork

一、函數fork fork函數原型&#xff1a; #include <unistd.h> pid_t fork(void); 二、程序清單 1. 測試代碼&#xff1a; #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h>…

【金三銀四】微軟java后端社招

分布式系統特性與衡量標準 透明性&#xff1a;使用分布式系統的用戶并不關心系統是怎么實現的&#xff0c;也不關心讀到的數據來自哪個節點&#xff0c;對用戶而言&#xff0c;分布式系統的最高境界是用戶根本感知不到這是一個分布式系統 可擴展性&#xff1a;分布式系統的根…

【面試必會】java虛擬機原理

如何才可以進大廠&#xff1f; 答案其實也很簡單&#xff0c;能力學歷。不知道大家有沒有發現&#xff0c;大廠的一些部門對于學歷要求已經放低了&#xff0c;阿里的一些部門同樣也招大專學歷的程序員&#xff0c;當然肯定也是因為他的能力足夠出色。 對于準備秋招的你來說&a…

函數exec

exec函數族 1. 執行指定目錄下的程序 #include <unistd.h> int execl(const char *path, const char *arg, ...);返回值&#xff1a;若出錯&#xff0c;返回-1&#xff1b;若成功&#xff0c;不返回 分析&#xff1a; path: 要執行的程序的絕對路徑變參arg: 要執行的…

【面試必備】java寫spark好不好

并發編程三大特性 原子性 一個操作或者多次操作&#xff0c;要么所有的操作全部都得到執行并且不會受到任何因素的干擾而中斷&#xff0c;要么所有的操作都執行&#xff0c;要么都不執行。 對于基本數據類型的訪問&#xff0c;讀寫都是原子性的【long和double可能例外】。 …

【面試必備】java面試題視頻講解

二、我們先來看看這份筆記到底有什么 1、先把kubernetes跑起來&#xff08;先跑起來創建kubernetes集群部署應用訪問應用Scale應用滾動更新&#xff09; 2、重要概念 3、部署kubernetes Cluster&#xff08;安裝docker安裝 kubelet.kubeadm和 kubectll用kubeadm 創建cluster&a…

【面試總結】java測試工程師培訓

阿里P8級架構師核心理論落地篇 再造淘寶&#xff0c;貫穿全系&#xff0c;阿里團隊代碼落地&#xff0c;詳細每個版本迭代&#xff0c;拒絕2-3個月PPT架構師再造淘寶之咚寶-技術支撐-完整搭建DevOps再造淘寶之咚寶-統一規則-代碼規范落地解析再造淘寶之咚寶搭建基礎服務再造淘…

進程組的應用

一、實驗1 題目&#xff1a;利用進程扇完成一個小實驗。該進程扇有 1 個父進程和 3 個子進程&#xff0c;我們希望達到圖 1 中的效果&#xff0c;即將進程 0 (父進程)和進程 1 設置成一組&#xff0c;假設為組 1&#xff0c;將進程 2 和 進程 3 設置成另一個組&#xff0c;假設…

【原理+實戰+視頻+源碼】docker映射端口教程

阿里巴巴Java崗面試題分享 1.HashMap 的內部結構&#xff1f;內部原理&#xff1f;和 HashTable 的區別&#xff0c;假如發?了 hash 碰撞&#xff0c;如何設計能讓遍歷效率?&#xff1f; 2.講一講講講 ConcurrentHashMap吧。 3.講一下JVM虛擬機內存結構&#xff0c;以及它…

前臺進程組、后臺進程組

一、前臺進程組、后臺進程組 cat | cat & cat | cat | cat 輸出結果&#xff1a; 二、主要函數應用 1. tcgetpgrp函數原型&#xff1a; #include <unistd.h> pid_t tcgetpgrp(int fd);返回值&#xff1a;若成功&#xff0c;返回前臺進程組ID, 若出錯&#xff0c;…

【原理+實戰+視頻+源碼】docker權限參數

一面&#xff1a; 個人介紹加項目介紹20分鐘 微服務架構是什么&#xff0c;它的優缺點&#xff1f; ACID CAP BASE理論 分布式一致性協議&#xff0c;二段、三段、TCC&#xff0c;優缺點 RPC過程 服務注冊中心宕機了怎么辦&#xff1f; 微服務還有其他什么組件 分布式架…

【孤兒進程】孤兒進程組、守護進程

一、孤兒進程組 1. 孤兒進程的定義&#xff1a; 定義1&#xff1a;該進程組的每個成員的父進程要么是該組的成員&#xff0c;要么在其它會話中。 定義2&#xff1a;一個進程不是孤兒進程組的條件是——該組有一個進程&#xff0c;其父進程在屬于同一會話的另一個組中。 只要能…

【吐血整理】用java編寫一個登陸界面

結構化數據、非結構化數據與半結構化數據 文章的開始&#xff0c;聊一下結構化數據、非結構化數據與半結構化數據&#xff0c;因為數據特點的不同&#xff0c;將在技術上直接影響存儲引擎的選型。 首先是結構化數據&#xff0c;根據定義結構化數據指的是由二維表結構來邏輯表…

線程概念

什么是線程 LWP&#xff1a;light weight process 輕量級的進程&#xff0c;本質仍是進程(在Linux環境下&#xff09; 進程&#xff1a;獨立地址空間&#xff0c;擁有PCB 線程&#xff1a;也有PCB&#xff0c;但沒有獨立的地址空間(共享) 區別&#xff1a;在于是否有共享地址…

【大牛瘋狂教學】cdhkafka打開的文件描述符臨界閾值

基本知識 1.學會分析源碼 程序員每天都和代碼打交道。經過數年的基礎教育和職業培訓&#xff0c;大部分程序員都會「寫」代碼&#xff0c;或者至少會抄代碼和改代碼。但是&#xff0c;會讀代碼的并不在多數&#xff0c;會讀代碼又真正讀懂一些大項目的源碼的&#xff0c;少之…

線程清理函數

一、線程清理函數 #include <pthread.h> void ptread_clean_push(void (*rtn) (void *), void *arg); 注冊清理函數&#xff0c;押棧 void ptread_clean_pop(int excute); 清理函數&#xff0c;出棧 分析&#xff1a;這兩個函數是成對出現的…