Mata解決了快取何時失效的世紀難題? - Lu
我們在 Meta/FB 的工程部落格上寫了一篇文章,介紹了我們如何管理快取失效的複雜性,並使快取在此過程中更加一致。我相信所描述的方法應該適用於大多數基於失效的快取。快取失效在電腦科學中可能不再是一件難事。
根據Hacker News上的討論,人們對於 Phil Karlton 在他的名言中所指的“快取失效”有不同的看法——電腦科學中只有兩件困難的事情:快取失效和命名事物。有些人認為快取失效很難,因為很難確定何時失效,讓我們來談談它。
(這裡並沒有將協調和一致性之間的權衡命名為快取失效問題,見Marc文章)
在其最通用的形式下,一個快取可以儲存來自任何資料來源的任意物化檢視。
這其中可物化依賴關係:例如,y = f(x);如果x改變了,快取中的y也需要改變/驗證。
然而,這個問題並不只存在於快取中。
例如,你可以在一個資料庫中儲存一個 "朋友 "表(在我們的例子中為x),而在同一個資料庫中儲存另一個 "朋友的朋友 "表(在我們的例子中為y)。現在,為了保持兩個表的一致性,基本上需要以事務方式更新它們(在一個ACID事務中是最簡單的),這意味著兩個模式都被與資料庫互動的人所知道。
我想說的是,y=f(x)的問題並不是使快取失效變得困難的原因。
如果你對何時以及如何可靠地使快取失效特別感興趣,這篇文章可能會有幫助。
與資料庫不同,快取的獨特之處在於,資料可以在任何地方、任何地方被快取。客戶端可以來執行任意的查詢,並將具體化的資料儲存在客戶端。關於快取資料的模式不會被資料來源知道。在這種情況下,這不是一個難點問題。在最通用的快取和資料來源的形式下,似乎很明顯,快取失效不可能在這種通用情況下工作,因為:
- 客戶端隨意來來去去,沒有確定性的叢集成員資格(例如,應該失效的客戶端的已知列表)
- 儲存在客戶端中的資料沒有被設計成資料表結構,因為它不能被資料來源知道。沒有通用的方法來確定狀態改變是否會影響客戶端上的某個快取條目。當然,一個人可以使一切無效,但客戶成員資格仍然是不確定的。
現在我們來談談這個問題的一個更具體的情況:當快取資料的模式(或使用的查詢)被告知資料來源/驗證管道。在這種情況下,當更新資料來源時,為了保持快取的一致性,你基本上需要對資料來源和快取進行事務(跨系統事務)。通常快取有更多的副本,我不認為同步執行這種型別的事務在規模上是實用的。
如果我們不在兩個系統(資料來源和快取)上同步進行事務會發生什麼?那麼,現在每當非同步更新管道執行計算時,它是針對一個移動的資料來源(而不是寫入時的快照)進行的。現在我們假設資料來源是Spanner,它提供了時間點的快照。在Spanner提交時,你可以得到一個提交時間(TrueTime)。現在利用這個提交時間,可以非同步讀取資料和計算快取更新。因為快取中的物化本身並不進行寫入,所以對它們的更新基本上是盲目進行的,可以通過提交時間(TrueTime)來排序。
這還是相當有用的,因為我們增加的唯一要求是,快取資料的資料表結構(使用的查詢)要讓資料來源(如資料庫)知道。這雖然很難建立,但可以做到。
如果這是你對 "快取失效 "的定義,我同意這很難;而且Meta這篇博文也沒有解決這個問題。困難是來自於你正在處理一個分散式系統的事實,從你開始使用cache的那一刻起。
如果說我從Hacker News上的這次公開的民間討論中學到了什麼,那就是”
- 我們應該避免將快取失效的權力/責任放在快取使用者的手中,而應該放在快取服務所有者(和資料庫所有者)的手中。
- 我們應該通過更好的抽象、更簡單的資料模型(例如圖資料模型)來提供護欄。
- 我們應該避免快取關係(獨立的物化),而更傾向於快取索引,這樣寫/驗證的放大作用就會受到限制。
banq評:該文作者,Meta的年輕工程師,可能沒有意識到:當你將同一份資料複製兩份,雖然只是兩份,不是三份或無數份,一份在資料來源,一份在快取,你已經面臨CAP定理 的三取二限制,而且快取和資料來源之間肯定存在網路連線,網路連線本身預設是不可能的,即使是在local host埠之間。
雖然,快取和資料來源之間理論是可以通過ACID事務來解決,但是這種ACID事務是類似2PC,還是一種一廂情願。
參考該文作者另外一篇快取失效的詳細解釋。他在文章中辯解重新定義“快取失效”:
- 我將在這裡將“快取”定義為本文中事實來源的任何物化檢視,除非另有說明,否則在本文中假設此定義。
- “失效”是指當真實來源發生變化時更新/刪除相關快取條目的操作,因此不會無限期地將陳舊資料儲存在快取中。
他的觀點還是認為,當真實資料來源發生變化時,更新刪除快取是一種可靠的操作,其實這個過程他忽視了網路連線的天生不可靠性,因此認為這個操作肯定會百分之百完成。
相關文章
- 如何解決快取失效問題快取
- Redis 快取擊穿(失效)、快取穿透、快取雪崩怎麼解決?Redis快取穿透
- 快取高一致性:Meta的快取失效解決方案快取
- 阿里一面:關於【快取穿透、快取擊穿、快取雪崩、熱點資料失效】問題的解決方案阿里快取穿透
- 快取問題(四) 快取穿透、快取雪崩、快取併發 解決案例快取穿透
- 程式碼解決快取穿透和快取雪崩問題快取穿透
- (轉載)喬二爺—阿里一面關於 快取穿透、快取擊穿、快取雪崩和熱點資料失效問題的解決方案阿里快取穿透
- [奇技Y巧]解決程式快取鎖命名困難,命名衝突問題快取
- 快取穿透問題與解決方法快取穿透
- 解決ajax中ie快取問題(手動新增時間戳)快取時間戳
- 執行緒的快取何時重新整理?執行緒快取
- Laravel、Vue雙大括號渲染不認短橫杆 - 的變數,被拆分了,世紀難題怎麼解決?LaravelVue變數
- 快取三大問題及解決方案快取
- 快取常見問題及解決方案快取
- 同時使用mybatis和mybatis-plus時,pageHelper失效問題解決MyBatis
- 快取穿透、快取擊穿、快取雪崩的場景以及解決方法快取穿透
- MySQL的查詢快取功能何時該開啟MySql快取
- 解決 ScrollView 巢狀 RecyclerView 時,慣性滑動失效的問題View巢狀
- 無處不在的 Kubernetes,難用的問題解決了嗎?
- 快取世界中的三大問題及解決方案快取
- 手摸手教你解決重定向快取問題快取
- redis快取相關問題及解決方案Redis快取
- 21世紀最重要的科學前沿問題之一,能就此得到解決嗎?
- 快取穿透、快取擊穿、快取雪崩概念及解決方案快取穿透
- 【Redis】快取穿透,快取擊穿,快取雪崩及解決方案Redis快取穿透
- REDIS快取穿透,快取擊穿,快取雪崩原因+解決方案Redis快取穿透
- JQuery中ajax的使用與快取問題的解決方法jQuery快取
- 優雅的快取解決方案--設定過期時間快取
- 世紀難題:AI 目前在測試領域有哪方面應用AI
- 世紀難題!搞了一個星期也沒弄成,請求大神幫助!
- 關於快取穿透、快取擊穿、快取雪崩的模擬與解決(Redis)快取穿透Redis
- Redis 快取穿透、快取雪崩原理及解決方案Redis快取穿透
- 快取過程存在的三大問題及解決方案快取
- 使用雙快取解決 Canvas clearRect 引起的閃屏問題快取Canvas
- gulp外掛解決瀏覽器快取問題瀏覽器快取
- 前端使用 gulp 解決多專案快取問題前端快取
- 布隆過濾器解決快取穿透問題過濾器快取穿透
- 解決企業採購管理的難題有Ta就夠了