如何解決快取失效問題
導讀 | 在如今大資料的時代下,高併發高可用是所有軟體開發都追求的目標,為了實現這一目標,快取的使用是每一個高併發系統都會涉及到的,使用快取可以保障系統的執行效率,提高系統的健壯性。 |
在高併發的系統架構中,大量網路請求的併發處理,導致資料庫的I/O消耗是非常巨大的,為了快速讀取資料,減少網路請求時延,緩解資料庫的壓力,因此在軟體開發中引入了快取技術。但是在快取的使用過程中也會遇到一些特殊情況導致快取失效,常見的快取失效的情況有三種:快取穿透、快取擊穿、快取雪崩。
快取(以Redis快取為例)的引入可以減少請求資料庫的次數,提高查詢效率,從而提升系統效能。一般的流程是:應用發起請求後,先查詢快取中是否存在所需資料,如果快取中存在,直接返回資料,如果快取中不存在所需資料,則需要去查詢資料庫,如果資料庫中存在所需資料,則一方面存入快取,另一方面返回查詢結果,如果資料庫中不存在,則返回空或者錯誤。
快取穿透(Cache Penetration)是指查詢一個一定不存在的資料,即使用者訪問的資料既不在快取當中,也不在資料庫中。由於快取中查詢不到資料,請求會去查詢資料庫,然而資料庫中也不存在該資料,也不會寫入快取,導致查詢該資料的時候,每次都要去資料庫中查詢,給資料庫到來壓力。
快取雪崩(Cache Avalanche)是指大量的快取資料在某一時刻超過了快取的過期時間,同時失效,導致高併發的請求同時去訪問資料庫,造成資料庫壓力過大,導致系統崩潰。這是針對多個快取資料而言的。
快取擊穿(Cache Breakdown)是指快取過期的一瞬間,有大量的請求去查詢同一個快取資料,由於該資料在承載著大併發,當該資料失效的一瞬間,持續的大併發就會直接去請求資料庫,造成資料庫壓力倍增。這是針對一個快取資料而言的。
- 第一種方案是採用布隆過濾器進行資料攔截。這也是針對快取擊穿採用的常用方案。在寫入資料時,使用布隆過濾器對資料的key進行標記,當帶有資料key的請求過來後,先用布隆過濾器驗證key是否存在,如果存在,再進入快取或者資料庫中進行查詢。
- 第二種方案是快取空值。當在資料庫中查詢不到資料時,將其快取為空值或者預設值。此時需要注意,針對其的快取過期時間不宜過長,一般設定為5分鐘內,當資料庫被寫入或者更新該key的新資料時,快取必須同時更新,保證資料的一致性。
- 一般是將key的過期時間後面增加一個隨機數,讓過期時間分散開,使key均勻失效,減少快取時間過期的重複率。
- 利用加鎖或佇列的方式,保證快取單執行緒寫,但是這種方案會影響併發量,多個請求過來時,只有一個在進行正常的操作,其他請求都會在等待的狀態,影響程式效能,不推薦使用。
- 使用快取標記,這是比較好的解決辦法。判斷標記是否過期,過期則去資料庫中請求,而快取資料的過期時間要設定的比快取標記長些,如此一來,當一個請求去運算元據庫的時候,其他的請求拿到的是上一次的快取資料。
- 使用互斥鎖,當快取的key過期時,多個請求過來時只允許一個請求去查詢資料庫構建快取,其他請求等待該請求執行完畢之後,重新從快取中獲取資料。
- 針對訪問量比較大的資料,即熱點資料,不設定快取過期時間,後臺非同步更新快取,適用於不嚴格要求快取一致性的場景。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2930908/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何解決ie瀏覽器的快取問題瀏覽器快取
- 阿里一面:關於【快取穿透、快取擊穿、快取雪崩、熱點資料失效】問題的解決方案阿里快取穿透
- Redis 快取擊穿(失效)、快取穿透、快取雪崩怎麼解決?Redis快取穿透
- 快取問題(四) 快取穿透、快取雪崩、快取併發 解決案例快取穿透
- 快取失效竟然可以這麼解決?快取
- 程式碼解決快取穿透和快取雪崩問題快取穿透
- 快取穿透問題與解決方法快取穿透
- Reddit是如何解決三個臭皮匠的快取首次更新問題?快取
- 如何解決資料庫與快取的一致性問題資料庫快取
- 如何解決相親交友原始碼中Redis快取擊穿、雪崩問題?原始碼Redis快取
- Mata解決了快取何時失效的世紀難題? - Lu快取
- 快取高一致性:Meta的快取失效解決方案快取
- (轉載)喬二爺—阿里一面關於 快取穿透、快取擊穿、快取雪崩和熱點資料失效問題的解決方案阿里快取穿透
- 快取常見問題及解決方案快取
- 快取三大問題及解決方案快取
- React如何解決fetch跨域請求時session失效問題React跨域Session
- Redis 快取失效機制Redis快取
- 如何解決快應用堆疊溢位問題
- 快取的問題快取
- beego快取問題Go快取
- SOAP快取問題快取
- .gitignore 失效問題解決Git
- 快取問題(一) 快取穿透、快取雪崩、快取併發 核心概念快取穿透
- 微信活碼技術如何解決微信群二維碼失效問題
- 如何解決訊息佇列的延時以及過期失效問題?佇列
- 手摸手教你解決重定向快取問題快取
- redis快取相關問題及解決方案Redis快取
- 如何解決快應用頁面滑動卡頓問題
- 快取同步的問題快取
- 瀏覽器端CORS策略+快取策略導致的跨域策略失效問題瀏覽器CORS快取跨域
- gulp外掛解決瀏覽器快取問題瀏覽器快取
- 前端使用 gulp 解決多專案快取問題前端快取
- 布隆過濾器解決快取穿透問題過濾器快取穿透
- jquery的get()函式快取問題解決方案jQuery函式快取
- Redis 面試常見問題———快取雪崩、快取擊穿以及快取穿透Redis面試快取穿透
- IE8快取問題快取
- java script css快取問題JavaCSS快取
- Redis快取穿透、快取雪崩、redis併發問題分析Redis快取穿透