1.認識緩存
緩存是指可以進行告訴數據交換的存儲器。當cpu處理數據時,先到Cache中尋找,如果數據因之前的操作已經讀取而被暫緩存其中,就不需要再從隨機存取存儲起(RAM)中讀取數據.
2.為什么使用緩存
減少計算量,縮短請求流程(減少網絡的I/O或者硬盤I/O).
在web世界,每一層都會被緩存
1.底層CPU緩存,磁盤未見系統緩存.
2.應用層Zend虛擬機的變量緩存.
3.數據庫層有Table Cache、Thread Cache、Query Cache
等等.
以Mysql緩存舉例:
緩存有3個要素:命中率、緩存更新策略、緩存最大數據量.
1.命中率:請求緩存次數和緩存返回結果次數的比例。比例越高,證明緩存的使用率越高.
Mysql提供一系列Global Status 記錄 Query Cache 當前狀態:
Qcache_free_blocks:目前處於空閑狀態的Query Cache 中內容block數目.
Qcache_free_memory:目前處於空閑狀態的Query Cache 內存總量.
Qcache_hits:Query Cache命中次數.
Qcache_inserts:向Query Cache中插入新的Query Cache次數,也就是沒有命中的次數.
Qcache_lowmem_prunes:當Query Cache內存容量不夠,需要從中刪除舊的Query Cache以給新Cahce對象使用的次數.
Qcache_not_cached:沒有被Cache的Sql數,包括無法被Cache的Sql以及由於query_cache_type設置而不會被Cache的Sql.
Qcache_queries_in_cache:目前在Query Cache中的SQL數量.
Qcache_total_blocks: Query Cache中的block數量.
2.緩存更新策略:
在Mysql中,可以設置Query Cache所使用的總內存,MySQL會把默認可以進行緩存的SQL語句的結果集進行緩存,一旦內存塞滿后,就會剔除老的Query Cache對象。同時為了保證Query Cache中的內容與是實際數據絕對一致,當表中的數據有任何變化,包括新增、修改、刪除等,都會使所有引用到該表的SQL的Query Cache 失效.
一般把緩存更新策略歸納為以下幾種:
FIFO:最先進入緩存得數據在緩存空間不夠情況下(超出最大元素限制時)會被首先清理出去.
LFU:最少使用的元素會被清理掉.這要求緩存的元素有hit屬性,在緩存空間不夠的情況下,hit值最小的將會被請出緩存.
LRU:最近最少使用的元素被清理.緩存的元素有一個時間戳,當緩存容量滿了,而又需要騰出地方緩存新元素時,現有緩存元素中時間戳離當前時間最遠的元素將被清出緩存.
MySQL一般使用FIFO策略,隊列清除.
3.緩存最大數據量:
在緩存中能處理元素的最大個數或所能使用的最大存儲空間。通常各種緩存機制都會對緩存最大數據量進行限定,可以是固定大小的存儲空間,集合個數,或者由操作系統所能分配和處理的存儲空間決定.
MySQL的Query Cache緩存最大數據由query_cache_size參數決定,並且可以修改.而基於內存的Key-Value實施方案Memcached,其緩存最大數據量可使用內存由操作系統決定,默認為64MB,每次最大可申請內存為 2MB;
超出緩存機制所允許的最大數據量系統會進行相應處理,一般由四種處理方式:
1.停止緩存服務,所有緩存數據被清空.
2.拒絕寫入,不再對緩存數據進行更新。
3.根據緩存更新策略清除舊數據。
4.在方式3基礎上,將淘汰的數據備份,騰訊新得空間.