整個網站應用中,緩存幾乎無處不在,既存在於瀏覽器、也存在於應用服務器和數據庫服務器;既能夠對數據緩存(分佈式緩存),也能夠對文件緩存(分佈式存儲系統),還能夠對頁面片斷緩存(ESI)。算法
1、合理使用緩存數據庫
1.頻繁修改的數據瀏覽器
緩存主要存放讀寫比很高、不多變化的數據。通常說來,數據的讀寫比在2:1以上,如商品類目信息、熱門搜索列表信息等。
緩存
2.沒有熱點的數據
服務器
若是應用系統訪問數據沒有熱點,不遵循二八定律,即大部分數據並無集中在小部分數據上,那麼緩存就沒有意義。
架構
3.數據不一致與髒讀併發
通常會對還存的數據設置失效時間,一旦超過失效時間,就會從數據庫從新加載,所以應用要容忍必定時間的數據不一致。
分佈式
4.緩存可用性memcached
爲了應對當緩存服務崩潰時,數據庫會由於徹底不能承受如此大的壓力而宕機,進而致使整個網站不可用(緩存雪崩故障),能夠經過緩存熱備或者分佈式緩存服務器集羣來改善緩存的可用性。
高併發
5.緩存預熱
能夠在緩存系統啓動時就把熱點數據加載好,這個緩存預加載手段叫做緩存預熱。經常使用於元數據如城市地名列表、類目信息等。
6.緩存穿透
若是由於不恰當的業務、或者惡意攻擊持續高併發地請求某個不存在的數據,因爲緩存沒有保存該數據,全部請求都會落到數據庫上,會對數據庫形成很大壓力,甚至崩潰。一個簡單的對策就是將不存在的數據也緩存起來(value爲null)。
2、Memcached高效的內存管理
Memcached採用一種集中式的緩存集羣管理,也稱做互不通訊的分佈式架構方式。它具備協議簡單和基於libevent的事件處理機制(通訊模塊)。
協議簡單:1.通訊協議 TCP|UDP
2.通訊序列化協議 基於文本的自定義協議
1. Slab Allocation機制
Memcached使用一個簡單的辦法——固定空間分配,它是按照預先規定的大小,將分配的內存分割成特定長度的塊,內存(chunk),並把尺寸相同的塊分紅組,來內存碎片管理問題。Memcached詳細內存分配策略
Slab Allocation構造圖
Slab Allocation主要術語:
Page:分配給Slab的內存空間,默認是1MB。分配給Slab以後根據slab的大小切分紅chunk。
Chunk:用於緩存記錄的內存空間。
Slab Class:特定大小的chunk的組。
2.在Slab中緩存記錄的原理
Memcached根據收到的數據的大小,選擇最適合數據大小的slab。 memcached中保存着slab內空閒chunk的列表,根據該列表選擇chunk, 而後將數據緩存於其中。
Slab Allocator機制解決了內存碎片問題,但也帶來了新的問題。即因爲分配的是特定長度的內存,所以沒法有效利用內存。如:將100字節的數據緩存到128字節的chunk中,剩餘的28字節就浪費了。
3.Memcached數據的刪除機制
Lazy Expiration:memcached內部不會監視記錄是否過時,而是在get時查看記錄的時間戳,檢查記錄是否過時。 這種技術被稱爲lazy(惰性)expiration。所以,memcached不會在過時監視上耗費CPU時間。
Memcached不會釋放已分配的內存。記錄超時後,客戶端就沒法再看見該記錄(invisible,透明),其存儲空間便可重複使用。
Memcached會優先使用已超時的記錄的空間,但即便如此,也會發生追加新記錄時空間不足的狀況, 此時就要使用名爲 Least Recently Used(最近最少使用 LRU)機制來分配空間。所以,當memcached的內存空間不足時(沒法從slab class 獲取到新的空間時),就從最近未被使用的記錄中搜索,並將其空間分配給新的記錄。
3、互不通訊的服務器集羣架構(分佈式)
Memcached雖然稱爲「分佈式」緩存服務器,但服務器端並無「分佈式」功能。memcached的分佈式是徹底由客戶端程序庫實現的。 這種分佈式是memcached的最大特色。
路由算法:1.根據餘數計算分散 2.一致性哈希算法