所謂分布式多級快取,就是指在整個系統的不同層級進行資料的快取,以提公升系統的訪問速度。通常情況下,分布式系統的訪問流程如下所示:
1、接入層nginx將請求負載均衡到應用層nginx,常用的負載均衡演算法是輪詢/一致性雜湊。輪詢可以是請求更加的平均,一致性雜湊可以提公升應用層nginx的快取命中率。
2、應用層nginx首先訪問local cache(lua shared dict、nginx proxy cache等),如果local cache命中,則直接返回。nginx本地快取應對熱點問題非常有效。
3、如果local cache未命中,則會讀取分布式快取(如redis)。如果命中,則返回結果,並寫入應用層nginx本地快取。
4、如果分布式快取未命中,則會回源到tomcat集群。
5、此時首先讀取tomcat本地快取,若有則返回,並非同步的寫入redis集群。若無則回源到db中去查詢,然後再寫入到redis中。這裡面需要注意的一點是,tomcat的local cache可以有效的緩解快取失效風暴的問題。詳情見redis的快取穿透、快取擊穿、快取雪崩和布隆過濾器
上述快取主要分為了三大類:應用層nginx本地快取、分布式快取、tomcat應用伺服器local cache。並且每一層都是用來解決不同的問題:應用層nginx用來解決快取熱點問題;分布式快取用來減少回源率;tomcat本地快取用於解決快取失效風暴的問題。
1. 不過期快取
通常情況下我們使用快取都會設定乙個過期時間,但在某些場景下我們需要設定不過期的快取。這個時候通常情況下是在事務結束後去寫入快取的,此時需要注意的是不要同步的去寫入快取,以免阻塞主流程。對於這種常駐快取的資料,一定要合理的管理,一般情況下可以定期的全量更新快取。
對於長尾快取(快取相對集中,但是有可能兩會很大的),如以時間為維度的資料(訂單/流水等),可以考慮使用lru cache,來使不常用的資料剔除快取。
2. 過期快取
對於過期快取,我們通常的用法是"懶載入"的方式。資料變更的時候去刪除快取,當讀取資料時,快取中沒有,回源db之後再寫入快取。這裡面需要根據業務場景去設定乙個合理的超時時間,對於比較熱點的資料,可以根據使用場景讓快取有一定的延遲,在使用者的忍受範圍之內就行了(如商品庫存/火車票庫存等)。
3. 細粒度快取
對於乙個電商系統,乙個商品可能拆分成基礎屬性,列表、上下架、規格引數等。當商品資訊變更時,此時就需要控制快取的粒度了,盡量小成本的去更新快取。如商品上下架,就只更新上下架維度的快取即可。
4. 大value快取
當使用redis快取時,應盡量避免使用大value儲存,這樣會拖慢讀取的速度。可以考慮的是:將其拆分為更小維度的資料,然後再組合返回前端。
5. 熱點快取
對於熱點快取,通常情況下需要設定多級快取,盡量避免資料通過網路去獲取。當分布式快取掛掉時,此時還需要考慮到"快取擊穿"的問題,此時可以使用白名單/布隆過濾器來作為快取的最後一道防線。
分布式快取
分布式快取 原則來說跟應用伺服器分布式應該是一樣,但快取是有狀態的。怎麼樣提高命中?1.最原始的演算法 那就是key hash取模,取到伺服器ip。在大量伺服器伸縮行有問題,加入一台伺服器就有可能讓所有的快取都失效。如 key hash 後是100,取10膜是0,取11膜 1,101 取10膜是1,...
分布式快取
網際網路發展的同時,也引領者相關技術的發展與變革,比如集群 高併發 負載均衡 高可用 海量資料的處理 系統安全 分布式快取等各方面的相關技術。簡單談一下分布式快取技術。2 三層架構 1 web層 表現層 主要對使用者資料接收,以及資料處理完成後返回,為客戶端提 用程式的訪問 2 應用層 對業務的處理...
分布式快取
分布式快取 1 什麼是分布式快取?在高併發的環境下,大量的i o處理與cpu的處理速度顯然不在同乙個數量級,從減輕資料庫的壓力和提高系統的響應速度兩個角度來考慮,因而都會在資料庫之前加一層快取。由於單機的記憶體資源和承載能力有限,因而可以採用多台伺服器來用作快取,使得多台快取伺服器形同一台,並且不會...