緩存

1、什麼是緩存?
緩存就是用來避免頻繁的到主存儲器(一般來說可能是數據庫,結構化的磁盤文件,遠程網絡接口,程序接口等等提供數據返回的)獲取數據而建立的一個存 取更快的臨時存儲器(緩存)。一般來說,緩存比主存儲器更小(不一定,也可能是存儲的數據結構不一樣,但是存取速度非常快),但 是存取速度非常快。

2、緩存的作用
緩存一般用來:
.存儲頻繁訪問的數據,如網站訪問人數統計等
.臨時存儲耗時的計算結果
.內存緩存減少磁盤IO

3、緩存類型
(a)在WEB開發中,緩存按照層次劃分可以分爲:
A、數據庫端緩存
B、應用層緩存
C、前端緩存
D、客戶端緩存


(b)按照緩存的數據劃分,可以分爲:
A、全量緩存;
B、增量緩存;
C、定量緩存

(c)按照緩存策略分,可以分爲:

A、單機緩存 
B、簡單分佈式緩存 
C、使用複製方式的緩存集羣 
D、使用散列方式的緩存集羣 
E、高性能高、可靠的緩存集羣

3.1、數據庫端緩存
這個可以用以“空間換時間”來說。比如建一個表來存儲另外一個表某個類型的數據的總條數,在每次更新數據的時候同事更新 數據表和統計條數的表。在需要獲取某個類型的數據的條數的時候,就不需要select count去查詢,直接查詢統計表就可以了,這樣可以提高查詢的速度和數據庫的性能。
3.2、應用層緩存
應用層緩存這塊跟開發人員關係最大,也是平時經常接觸的。
.緩存數據庫的查詢結果,減少數據的壓力。這個在大型網站是必須做的。
.緩存磁盤文件的數據。比如常用的數據可以放到內存,不用每次都去讀取磁盤,特別是密集計算的程序,比如中文分詞的詞庫。
.緩存某個耗時的計算操作,比如數據統計。
應用層緩存的架構也可以分幾種
.嵌入式,也就是緩存和應用在同一個機器或者服務。比如單機的文件緩存,java中用hashMap來緩存數據等等。這種緩存速度快,沒有網絡消耗。
.分佈式緩存,把緩存的數據獨立到不同的機器,通過網絡來請求數據,比如常用的memcache就是這一類。
分佈式緩存一般可以分爲幾種:
.按應用切分數據到不同的緩存服務器或者服務,這是一種比較簡單和實用的方式。
.按照某種規則(hash,路由等等)把數據存儲到不同的緩存服務器
.代理模式,應用在獲取數據的時候都由代理透明的處理,緩存機制有代理服務器來處理

頁面片段緩存
    針對動態頁面裏相對靜態的部分進行緩存
數據緩存
    在進行頁面片段緩存後,系統的壓力確實進一步降低了,但同樣,隨着訪問量的增加,系統還是開始變慢,經過查找,可能會發現系 統中存在一些重複獲取數據信息的地方,像獲取用戶信息等,這個時候開始考慮是不是可以將這些數據信息也緩存起來呢,於是將這些數據緩存到本地內存,進行數據緩存。

緩存架構




3.2.1、應用層緩存數據分類
(1)對數據分類目的:
• 滿足高併發要求;
• 使緩存的內容更加廣泛。
(2)按照數據更新頻率劃分,可分爲如下三類:
         a、高頻率使用但不頻繁更新的業務數據:由於不頻繁更新,所以可以在系統啓動時,從數據庫中加載,放入redis。如果更新,需重啓服務,當然這比較笨。更好的做法是在系統啓動的同時,啓動一個監聽通道(如利用redis的pub/sub功能)。當數據發生更新時,往通道publish一個消息,系統接收到消息後,重新從數據庫中加載數據,放入緩存。這樣系統實現了無中斷的更新緩存。
         b、高頻率使用更新還算頻繁的業務數據:由於有一定頻率的更新,所以可以在用戶訪問時,查詢緩存,如果沒有值,則從數據庫中加載入redis,並設置過期時間。這樣,過期時間內的訪問就都走緩存了。這種策略也有問題,就是大併發訪問時,容易造成數據庫瞬間高併發讀,如果程序再寫的爛點,查詢語句再複雜點,那可能造成數據庫死鎖。更好的做法是單獨啓動一個定時任務,把定時任務看做是一個用戶,他每隔一段時間從數據庫中讀取數據,然後放入緩存。而前臺用戶訪問的始終是緩存數據,不會觸發數據庫的相關操作。這個策略也可以用在場景一中。
         c、高頻率使用高頻率更新的業務數據:這種數據就需要在寫入數據庫的同時放入緩存,不設置過期時間,這樣用戶每次訪問都走緩存。爲了保證數據的一致,還有數據對內存的佔用,還需要有一些額外的策略。

3.2.2、數據一致行問題考慮:

按照數據更新頻率劃分,可以在一定程度上保證數據的一致性,但是不滿足對數據有高一致性的要求。

具體取決於你的系統在延遲性、吞吐量和一致性等方面的取捨,這裏也是適用CAP定理的。如果你要求高一致性和低延遲性,類似關係數據庫一樣的要求,那麼建議你使用terracotta之類的數據網格緩存,還有Oracle的Coherence,它們都在內存上加了一致性鎖之類機制;如果你要求有很大吞吐量,應付互聯網龐大用戶蜂擁而進的數據,那麼採取NoSQL或memcache、redis之類解決方案。

3.3、前端緩存
我們這裏說的前端緩存可以理解爲一般使用的cdn技術,利用squid,nginx等做前端緩衝技術,主要還是針對靜態文件類型,比如圖片,css,js,html等靜態文件。
3.4、客戶端緩存
瀏覽器端的緩存,可以讓用戶請求一次之後,下一次不在從服務器端請求數據,直接從本地緩存讀取,可以減輕服務器負擔也可以加快用戶的訪問速度。
4、緩存的過期和更新
4.1、緩存的過期包含
.時間過期
         我們在緩存數據的時候我們可以指定數據緩存的最大時間,如果超過這個時間,我們就認爲緩存是失效的。
.基於規則的過期
         我們在緩存中存儲了某些數據來標明數據的版本。比如存取的時間,更新的時間,數據的版本信息等等。然後比較這些信息是否有變化來判斷是否過期。
4.2、緩存的更新包含

.被動
當緩存失效的時候我們的應用程序重新從主存儲器中取數據,然後重新放回緩存中。
.主動
當數據一更新的時候,我們的應用主動的去更新我們的緩存內容。
.被動和主動結合(基於版本)

當數據一更新的時候,我們更新一個數據被更新的標誌。然後根據上面講到的“基於規則的過期”來更新數據。

5、緩存系統評價

緩存系統評價從下面三個方面進行綜合考慮:

1)速度;

2)及時性;

3)命中率。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章