不同的場景下如何選擇和使用適用的緩存框架
,講述在不同的場景下如何選擇和使用適用的緩存框架,以達到提升服務質量,優化系統架構的目的。
一般而言,現在互聯網模式(一個網站或一個應用),整體流程可以概括描述為 瀏覽器→應用服務器→數據庫或文件(存儲)→應用服務器→瀏覽器,這是一個標準流程,通過瀏覽器(或App界面)發起請求,經過服務器、數據庫計算整合后反饋瀏覽器呈現內容。隨著互聯網的普及,內容信息越來越復雜,使用者和訪問量越來越大,我們的應用需要支撐更多的并發量,同時我們的應用服務器和數據庫服務器所做的計算也越來越多。但是往往我們的應用服務器資源是有限的,且技術變革是緩慢的,數據庫每秒能接受的請求次數也是有限的(或者文件的讀寫也是有限的),如何能夠有效利用有限的資源來提供盡可能大的吞吐量?一個有效的辦法就是減少計算量,縮短請求流程——這就是緩存。緩存的出現就是打破上述的標準流程,其中的任何一個環節都可以被截斷,請求可以從緩存中直接獲取目標數據并返回。通過這種打破常規的方式,有效減少計算量,縮短請求流程,有效提升響應速度,節省硬件資源,讓有限的資源服務更多的用戶。
如圖1所示,緩存的使用可以出現在 1-4的各個環節中,每個環節的緩存方案與使用各有特點。
圖1 網絡應用一般流程
緩存特征
根據面向對象的軟件思維來看,緩存就是一個對象類型,那么必然有它的屬性:
命中率
命中率=返回正確結果數/請求緩存次數,命中率問題是緩存中的一個非常重要的問題,它是衡量緩存有效性的重要指標。命中率越高,表明緩存的使用率越高。
最大元素(或最大空間)
緩存中可以存放的最大元素的數量,一旦緩存中元素數量超過這個值(或者緩存數據所占空間超過其最大支持空間),那么將會觸發緩存啟動清空策略根據不同的場景合理的設置最大元素值往往可以一定程度上提高緩存的命中率,從而更有效的時候緩存。
清空策略
如上描述,緩存的存儲空間有限制,當緩存空間被用滿時,如何保證在穩定服務的同時有效提升命中率?這就由緩存清空策略來處理,設計適合自身數據特征的情況策略能有效提升命中率。常見的一般策略有:
a. FIFO(first in first out)
先進先出策略,最先進入緩存的數據在緩存空間不夠的情況下(超出最大元素限制)會被優先被清除掉,以騰出新的空間接受新的數據。策略算法主要比較緩存元素的創建時間。
b. LFU(less frequently used)
最少使用策略,無論是否過期,根據元素的被使用次數判斷,清除使用次數較少的元素釋放空間。策略算法主要比較元素的hitCount(命中次數)。
c. LRU(least recently used)
最近最少使用策略,無論是否過期,根據元素最后一次被使用的時間戳,清除最遠使用時間戳的元素釋放空間。策略算法主要比較元素最近一次被get使用時間。
除此之外,還有一些簡單策略比如:
根據過期時間判斷,清理過期時間最長的元素;
根據過期時間判斷,清理最近要過期的元素;
隨機清理;
根據關鍵字(或元素內容)長短清理等。
緩存介質
?。◤挠布橘|上來看,無非就是內存和硬盤兩種)從技術上劃分,可以分成幾種,內存、硬盤文件、數據庫。
內存:將緩存存儲于內存中是最快的選擇,無需額外的I/O開銷,但是內存的缺點是沒有持久化落地物理磁盤,一旦應用異常break down,重新啟動數據很難或者無法復原。
硬盤:一般來說,很多緩存框架會結合使用內存和硬盤,在內存分配空間滿了或是在異常的情況下,可以被動或主動的將內存空間數據持久化到硬盤中,達到釋放空間或備份數據的目的。
數據庫:前面我們有提到,增加緩存的策略的目的之一就是為了減少數據庫的I/O壓力?,F在使用數據庫做緩存介質是不是又回到了老問題上了?其實,數據庫也有很多種類型,像那些不支持SQL,只是簡單的key、value的存儲結構的特殊數據庫(如berkleydb),響應速度和吞吐量都遠遠高于我們常用的關系型數據庫等。
在目前的應用服務框架中,我們對緩存的分類劃分更常用的是根據緩存與應用的耦合程度,劃分為local cache(本地緩存)和remote cache(分布式緩存):
Local cache:指的是在應用中的緩存組件,其最大的優點是應用和cache是在同一個進程內部,請求緩存非常快速,沒有過多的網絡開銷等,在單應用不需要集群支持或者集群情況下各節點無需互相通知的場景下使用本地緩存較合適;同時,它的缺點也是應為緩存跟應用程序耦合,多個應用程序無法直接的共享緩存,各應用或集群的各節點都需要維護自己的單獨緩存,對內存是一種浪費。
Remote cache::指的是與應用分離的緩存組件或服務,其最大的優點是自身就是一個獨立的應用,與本地應用隔離,多個應用可直接的共享緩存。
目前各種類型的緩存都活躍在成千上萬的應用服務中,還沒有一種緩存方案可以解決一切的業務場景或數據類型,我們需要根據自身的特殊場景和背景,選擇最適合的緩存方案。緩存的使用是程序員、架構師的必備技能,好的程序員能根據數據類型、業務場景來準確判斷使用何種類型的緩存,如何使用這種緩存,以最小的成本最快的效率達到最優的目的。
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%