在原始的系統架構中,咱們都由程序直接鏈接DB,隨着業務的進一步開展,DB的壓力愈來愈大,爲了緩解DB的這一壓力,咱們引入了緩存,在程序鏈接DB中加入緩存層,html
從而減輕數據庫壓力,並且緩存通常存在於內存中,相比於存在硬盤中的DB在讀取速度上絕對是比DB高几個等級。下面咱們來簡單聊聊關於緩存幾個東西linux
緩存的優勢就是「快」,一個快字基本能歸納了。如上文說的加速讀寫,分流對數據庫的壓力,歸根結底就是對快字的應用及其自己,缺點主要是以下三點:redis
1.數據不一致性:DB的數據與緩存中的數據不一致算法
2.開發成本:須要同時處理緩存層跟DB層的邏輯,增長了開發成本數據庫
3.維護成本:例如須要對緩存層進行一個監控,增長了運維的成本windows
在上面中咱們說到數據不一致性,通常來講緩存也是須要有生命週期的,須要被更新或者刪除,這樣才能保持緩存的可控性,在緩存更新中有以下三點:後端
假設一張用戶表有20個字段,那是否須要將所有字段都放到緩存中?這就涉及到一個粒度的問題!數據字段放少了,就會出現了不通用的問題;數據字段放多了,空間佔用也多,序列化跟反序數組
列化消耗的性能更多了。在粒度這個問題上仍是須要根據通用性,代碼維護,性能跟空間佔用這幾點上進行考慮, 簡單來講就是靠經驗了緩存
緩存穿透指的是查詢一個不存在的數據,DB跟緩存都不會命中的數據。這樣的話每次查詢都會到DB層中查詢,DB層負載加大還有可能形成死機,這樣緩存就失去了保護DB層的意義。出現這種狀況有兩種:1.攻擊,爬蟲的大量請求;2.業務自身有問題。如今基本流行的解決方案有如下兩種:架構
5.1 緩存空對象,當DB層也查不到數據的時候,緩存一個null值進緩存,這樣下一次的話就直接從緩存中讀取,保護了後端。不過這種帶來的後果是緩存了更多的鍵,須要更多的空間,並且不可控性增長
指的是原先的緩存層承載了大量的請求,有效的保護了DB層,可是假如緩存層炸了,那全部的請求都直接穿透到DB層,會容易形成DB層也炸了。就這個問題一直沒有一個很完美的解決方案,能夠從下列兩個方面進行思考:
最後用Xmind總結一下:
出處:http://www.cnblogs.com/powerdk/p/7116830.html