成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

3種緩存讀寫策略都不了解?面試很難讓你通過啊兄弟!

存儲 存儲軟件
看到很多小伙伴簡歷上寫了“熟練使用緩存”,但是被我問到“緩存常用的 3 種讀寫策略”的時候卻一臉懵逼。

 [[356557]]

本文轉載自微信公眾號「JavaGuide」,作者Guide哥 。轉載本文請聯系JavaGuide公眾號。 

看到很多小伙伴簡歷上寫了“熟練使用緩存”,但是被我問到“緩存常用的 3 種讀寫策略”的時候卻一臉懵逼。

造成這個問題的原因是我們在學習 Redis 的時候,可能只是簡單了寫一些 Demo,并沒有去關注緩存的讀寫策略,或者說壓根不知道這回事。

但是,搞懂 3 種常見的緩存讀寫策略對于實際工作中使用緩存以及面試中被問到緩存都是非常有幫助的!

下面我會簡單介紹一下自己對于這 3 種緩存讀寫策略的理解。

另外,這 3 種緩存讀寫策略各有優劣,不存在最佳,需要我們根據具體的業務場景選擇更適合的。

個人能力有限。如果文章有任何需要補充/完善/修改的地方,歡迎在評論區指出,共同進步!——愛你們的 Guide哥

Cache Aside Pattern(旁路緩存模式)

Cache Aside Pattern 是我們平時使用比較多的一個緩存讀寫模式,比較適合讀請求比較多的場景。

Cache Aside Pattern 中服務端需要同時維系 DB 和 cache,并且是以 DB 的結果為準。

下面我們來看一下這個策略模式下的緩存讀寫步驟。

寫 :

  • 先更新 DB
  • 然后直接刪除 cache 。

簡單畫了一張圖幫助大家理解寫的步驟。

讀 :

  • 從 cache 中讀取數據,讀取到就直接返回
  • cache 中讀取不到的話,就從 DB 中讀取數據返回
  • 再把數據放到 cache 中。

簡單畫了一張圖幫助大家理解讀的步驟。

你僅僅了解了上面這些內容的話是遠遠不夠的,我們還要搞懂其中的原理。

比如說面試官很可能會追問:“在寫數據的過程中,可以先刪除 cache ,后更新 DB 么?”

答案: 那肯定是不行的!因為這樣可能會造成數據庫(DB)和緩存(Cache)數據不一致的問題。為什么呢?比如說請求 1 先寫數據 A,請求 2 隨后讀數據 A 的話就很有可能產生數據不一致性的問題。這個過程可以簡單描述為:

請求 1 先把 cache 中的 A 數據刪除 -> 請求 2 從 DB 中讀取數據->請求 1 再把 DB 中的 A 數據更新。

當你這樣回答之后,面試官可能會緊接著就追問:“在寫數據的過程中,先更新 DB,后刪除 cache 就沒有問題了么?”

答案:理論上來說還是可能會出現數據不一致性的問題,不過概率非常小,因為緩存的寫入速度是比數據庫的寫入速度快很多!

比如請求 1 先讀數據 A,請求 2 隨后寫數據 A,并且數據 A 不在緩存中的話也有可能產生數據不一致性的問題。這個過程可以簡單描述為:

請求 1 從 DB 讀數據 A->請求 2 寫更新數據 A 到數據庫并把刪除 cache 中的 A 數據->請求 1 將數據 A 寫入 cache。

現在我們再來分析一下 Cache Aside Pattern 的缺陷。

缺陷 1:首次請求數據一定不存在 cache 的問題

解決辦法:可以將熱點數據可以提前放入 cache 中。

缺陷 2:寫操作比較頻繁的話導致 cache 中的數據會被頻繁被刪除,這樣會影響緩存命中率 。

解決辦法:

  • 數據庫和緩存數據強一致場景 :更新 DB 的時候同樣更新 cache,不過我們需要加一個鎖/分布式鎖來保證更新 cache 的時候不存在線程安全問題。
  • 可以短暫地允許數據庫和緩存數據不一致的場景 :更新 DB 的時候同樣更新 cache,但是給緩存加一個比較短的過期時間,這樣的話就可以保證即使數據不一致的話影響也比較小。

Read/Write Through Pattern(讀寫穿透)

Read/Write Through Pattern 中服務端把 cache 視為主要數據存儲,從中讀取數據并將數據寫入其中。cache 服務負責將此數據讀取和寫入 DB,從而減輕了應用程序的職責。

這種緩存讀寫策略小伙伴們應該也發現了在平時在開發過程中非常少見。拋去性能方面的影響,大概率是因為我們經常使用的分布式緩存 Redis 并沒有提供 cache 將數據寫入 DB 的功能。

寫(Write Through):

  • 先查 cache,cache 中不存在,直接更新 DB。
  • cache 中存在,則先更新 cache,然后 cache 服務自己更新 DB(同步更新 cache 和 DB)。

簡單畫了一張圖幫助大家理解寫的步驟。

 

讀(Read Through):

  • 從 cache 中讀取數據,讀取到就直接返回 。
  • 讀取不到的話,先從 DB 加載,寫入到 cache 后返回響應。

簡單畫了一張圖幫助大家理解讀的步驟。

Read-Through Pattern 實際只是在 Cache-Aside Pattern 之上進行了封裝。在 Cache-Aside Pattern 下,發生讀請求的時候,如果 cache 中不存在對應的數據,是由客戶端自己負責把數據寫入 cache,而 Read Through Pattern 則是 cache 服務自己來寫入緩存的,這對客戶端是透明的。

和 Cache Aside Pattern 一樣, Read-Through Pattern 也有首次請求數據一定不在 cache 的問題,對于熱點數據可以提前放入緩存中。

Write Behind Pattern(異步緩存寫入)

Write Behind Pattern 和 Read/Write Through Pattern 很相似,兩者都是由 cache 服務來負責 cache 和 DB 的讀寫。

但是,兩個又有很大的不同:Read/Write Through 是同步更新 cache 和 DB,而 Write Behind Caching 則是只更新緩存,不直接更新 DB,而是改為異步批量的方式來更新 DB。

很明顯,這種方式對數據一致性帶來了更大的挑戰,比如 cache 數據可能還沒異步更新 DB 的話,cache 服務可能就掛掉了。

這種策略在我們平時開發過程中也非常少見,但是不代表它的應用場景少,比如消息隊列中消息的異步寫入磁盤、MySQL 的 InnoDB Buffer Pool 機制都用到了這種策略。

原文鏈接:https://mp.weixin.qq.com/s/bWofuM5eS2Q8ylF-4AD0kA

 

責任編輯:武曉燕 來源: JavaGuide
相關推薦

2021-07-12 07:01:39

AST前端abstract sy

2011-03-29 15:44:41

對日軟件外包

2017-03-07 13:52:38

程序員調試片斷

2019-04-03 09:10:35

Rediskey-value數據庫

2019-11-21 15:08:13

DevOps云計算管理

2010-08-19 10:12:34

路由器標準

2017-12-26 11:37:32

云原生CNCF容器

2013-11-11 10:07:43

靜態路由配置

2015-06-05 09:52:41

公有云風險成本

2018-07-16 09:00:32

LinuxBash數組

2017-03-13 17:25:00

移動支付技術支撐易寶

2020-11-30 06:27:35

Java泛型Object

2020-04-20 10:55:57

大數據人工智能技術

2020-09-16 07:59:40

數組內存

2023-02-16 07:38:38

非機械鍵電路薄膜,

2019-05-14 14:51:40

Java語法糖用法

2021-01-14 08:31:54

Web開發應用程序

2012-02-21 09:20:50

Hadoop大數據

2023-02-12 21:54:32

架構AI元宇宙

2010-07-27 09:00:32

MySQL鎖
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久影院 | 亚洲精品视频在线观看视频 | 亚洲二区精品 | 日韩欧美在线一区 | 久久久久一区二区三区 | a免费视频| 狠狠综合久久av一区二区老牛 | 成人免费视频网站在线观看 | 成人在线免费观看视频 | 久久成人精品视频 | 亚洲aⅴ一区二区 | 国产一级片网站 | 色综合久久天天综合网 | 国产视频福利 | 欧美一区二区小视频 | 偷拍自拍网站 | 中文字幕一区二区三区乱码在线 | 国产精品一区二区久久 | 黄网站免费在线看 | 国产视频在线观看一区二区三区 | 亚洲日本欧美 | 日韩精品一区二区三区免费观看 | 欧美男人亚洲天堂 | 每日更新av | 精品日韩一区二区 | 久久国产精品网站 | 亚洲瑟瑟 | 免费视频一区二区 | 亚洲免费视频一区 | 久久91精品国产一区二区三区 | 亚洲精品欧美 | 午夜久久久| 97精品国产97久久久久久免费 | 99久久久久久久 | 久久精品亚洲欧美日韩精品中文字幕 | 国产精品久久久久久久免费观看 | 国产欧美精品一区 | 91成人午夜性a一级毛片 | 欧美成人精品一区二区三区 | 天天综合网91 | 91精品国产一区二区三区 |