快取一直是web2.0應用的效能核心,快取大幅提高了應用qps,減少了資料庫的壓力,降低了rt,讓應用能夠飛起來。快取具有易於上手,難於精通的特點,快取失效的設計是整個快取應用的難點,在某些複雜情況,不適合的快取設計增加了系統出錯的可能。下面對快取使用的幾種典型情況做下分析。
用於快取複雜演算法的不可變計算結果。
在某些場景,本地快取作為分布式快取的前置快取使用,可以設定乙個過期時間較長的分布式快取,同時設定乙個過期時間較短的本地快取。
資料變化率極低的情況下(例如按天更新);往往也使用定時任務或者物件內建乙個定時器從資料庫獲取最新的資料更新過期資料,相比按時間過期這種失效策略,這種定時更新的策略具有更好的效能。
分布式快取是應用開發中最常見的技術,分布式快取解決了本地快取的不一致問題,也避免了本地快取可能帶來的記憶體洩露問題。通常使用annotation的方式指定crud操作如何進行快取,在annotation中指定key,過期時間,快取策略(ehcache,memcache,分級快取),在快取具有高命中率的情況下可以極大的減少資料庫壓力,大大提高了系統的吞吐量。
當快取失效,請求不能從快取中取出資料時,一般查詢資料庫獲取,當併發量很高的時候,會給資料庫帶來極高的壓力甚至雪崩,導致服務不可用。一般有幾種做法,1)增加乙個鎖,快取失效時獲取鎖,只有獲取鎖的請求才去查詢資料庫。2)增加乙個存活快取,當存活快取為空時,重置存活快取,然後獲取資料,這樣只有第乙個檢查到存活快取為空的請求會訪問資料庫。
3) 優雅降級,對於某些不重要的資料(例如文章瀏覽量),當快取失效時,可以直接返回空,前端不做展示。
在某些條件下,獲取到的資料是list,並且需要(必然)進行分頁展示。快取在幾種情況下不適合使用,其中一種就是快取大物件,大物件會導致快取的效能降低,網路開銷和計算開銷也比較大。按照每頁的key快取資料也是不合適的,當有寫操作時需要失效所有的key。對於需要快取分頁資料的需求,視情況可以 1)只快取前2頁資料,絕大部分的流量都集中在前2頁。2)只快取id的list,獲取到id的list後進行分頁,然後通過service獲取每個id的快取資料。
在某些場景,具有高頻的寫操作(例如記錄瀏覽數,遊戲領域)如果對資料的準確性要求不高,可以通過快取寫操作,定時存檔的方式大幅提高效能。例如所有的瀏覽數都記錄在快取中,每分鐘更新一次資料庫,在某些關鍵操作後(例如擊殺boss),可以強制更新資料庫一次,保證資料不因為宕機而丟失。
分布式快取提供了統一的儲存和原子操作,便於集群環境下的使用。庫存計算是分布式快取的乙個典型應用場景,在使用者購買商品前會進行減庫存,雖然在高併發時會將庫存減為負數,但只要保證快取中的數值大於等於0時才能購買就能防止超賣。
在秒殺的場景中可以本地快取配合分布式快取使用,因為秒殺的時間太短,使用者並不關心秒殺過程中的庫存數,例如秒殺商品只有5件,可以在每台伺服器做乙個庫存數等於5的原子計數器,這樣將極大減少分布式快取的請求數。甚至在秒殺的場景中,可以完全使用記憶體快取,通過zookeeper提前指定一台機器的記憶體庫存數等於5,其他機器都設定為0。
參考:高擴充套件性**的50條原則
構建高效能web站點
快取的使用
關於快取的方法即用法介紹,命名空間 system.web.caching。第一 cache中的add方法 引數 cache.add string key,cache中的鍵 object value,cache中的值 cachedependency dependencies,依賴的項,可以是某個檔案路...
快取的使用
asp.net快取主要分為 頁面快取 中庸 資料來源快取 最不靈活的 資料快取 靈活 這三種主要型別。頁面快取 給頁面新增 outputcache duration 15 varybyparam none 標籤就可以啟用頁面快取,這樣整個頁面的內容都會被快取,頁面中的asp.net 資料來源在快取期...
NSData快取的使用
nsstring filename testfilensfilemangager.txt nsarray paths nssearchpathfordirectoriesindomains nsdocumentdirectory nsuserdomainmask yes nsstring docum...