java中緩存分類總結
在平時的開發中會經常用到緩存,比如locache、redis等,但一直沒有對緩存有過比較全面的總結。下面從什麽是緩存、為什麽使用緩存、緩存的分類以及對每種緩存的使用分別進行分析,從而對緩存有更深入的了解。
1.什麽是緩存
在使用緩存前我們應該了解什麽是緩存,下面是維基百科上面對於緩存的定義:
緩存是在計算機上的一個原始數據的復制集,以便於訪問
緩存在計算機系統中被廣泛應用,從緩存的定義來看,緩存是計算機上的原始數據的復制集,因此對於緩存的使用與應用場景密切相關,在不同的場景上會有不同的意義。
2.為什麽使用緩存
首先對於互聯網應用來說,用戶體驗是非常重要的,而使用緩存的目的是想通過提高服務的性能從而提高應用的用戶體驗。
而系統性能的指標一般包括:響應時間、延遲時間、吞吐量、並發用戶數量和資源利用率等幾個方面。
吞吐量:系統在單位時間內處理的請求的數量
3.緩存的分類
對於java程序開發者來說,根據緩存在軟件系統中所處的位置的不同,緩存大體可以分為三類:
- 客戶端緩存
- 服務端緩存
- 網絡中緩存
下面主要針對客戶端緩存和網絡中緩存簡單說明,並對服務端緩存做詳細說明
3.1客戶端緩存
對於BS架構的互聯網應用來說客戶端緩存主要分為頁面緩存和瀏覽器緩存兩種,對於APP而言主要是自身所使用的緩存。
3.2網絡中緩存
網絡中的緩存主要是指代理服務器對客戶端請求數據的緩存,主要分為WEB代理緩存和邊緣緩存(CDN邊緣緩存)
3.3服務端緩存
對於服務端緩存而言,從系統的架構上面區分可以將緩存分為
- 服務器本讀緩存(localCache)
- 分布式緩存(Redis、Memcached等nosql)
- 數據庫緩存
3.3.1 服務器本地緩存
本地緩存是一級緩存,位於服務本機的內存中,在操作本地緩存的時候不需要網絡IO不需要文件IO,直接從本機內存中讀取數據,因此讀寫速度最快。
本地緩存存在的問題:
- 本讀緩存數據直接保存在JVM中,需要考慮緩存數據的大小、JVM的垃圾回收性能消耗
- 單服務是集群部署的時候,應該考慮是否需要做集群中本地緩存的數據同步
在實際的開發中可以自己實現簡單的本地緩存也可以使用開源的本地緩存框架,比如:ehcache、JBoss Cache等
3.3.2分布式緩存
當本地緩存被穿透的時候就會去查詢分布式緩存,當在分布式緩存中查詢到數據的時候,直接將查詢結果放到本地緩存中。
對於分布式緩存主要是使用NoSQL數據庫來實現,常用的NoSQL數據庫有Redis、Memcached、MongoDB等。目前比較流行的Redis來說,支持Slava/Master模式和Cluster
3.3.3緩存中的幾個常用術語
1.緩存命中:當客戶端請求的數據在緩存中,這個緩存中的數據就會被使用,這一行為被稱為緩存命中
2.沒有命中:緩存中沒有查詢到數據,並且數據庫中可以查到此數據,並將數據放到緩存中
3.緩存穿透:是指查詢一個緩存中一定不存在的數據。即緩存中不存在,並且數據庫中也不存在,並且在數據庫中沒有查詢到數據的情況下,不會去寫緩存,這樣就導致每次對於此數據的查詢都會去查詢數據庫,這樣就導致緩存失去了意義。對於如何解決緩存穿透問題,後面會具體分析。
4.存儲成本:緩存沒有命中的時候,從其他數據源取出數據並放到緩存中的時間成本和空間成本就是存儲成本。
5.緩存失效:當緩存中的數據已經更新時,則此數據已經失效
6.替代策略:當緩存沒有命中的時,並且緩存容量已滿,就需要在緩存中去除一條舊數據,然後加入一條新數據,而應該去除哪些數據,就由替代策略來決定。
常用的替代策略有:LRU、LFU等。在使用緩存算法的時候,通常會考慮使用頻率、獲取成本、緩存容量和時間等因素。
8.緩存雪崩
3.3.4使用雲服務提供的緩存服務
國內的阿裏雲扽提供商提供Redis的雲服務器,這些服務有以下特點:
1.動態擴容:通過後臺配置升級Redis存儲空間
2.數據多備,數據存儲在一主一備中
3.自動容災:主機宕機後系統自動檢測,並切換到備機上,實現了服務的高可用
3.3.5數據庫緩存
數據庫在設計的時候也有緩存操作,更改相關參數開啟查詢緩存
java中緩存分類總結