1. 程式人生 > >java中常用的幾種快取型別介紹

java中常用的幾種快取型別介紹

在平時的開發中會經常用到快取,比如locache、redis等,但一直沒有對快取有過比較全面的總結。下面從什麼是快取、為什麼使用快取、快取的分類以及對每種快取的使用分別進行分析,從而對快取有更深入的瞭解。

1.什麼是快取

在使用快取前我們應該瞭解什麼是快取,下面是維基百科上面對於快取的定義:

快取是在計算機上的一個原始資料的複製集,以便於訪問

快取在計算機系統中被廣泛應用,從快取的定義來看,快取是計算機上的原始資料的複製集,因此對於快取的使用與應用場景密切相關,在不同的場景上會有不同的意義。

2.為什麼使用快取

首先對於網際網路應用來說,使用者體驗是非常重要的,而使用快取的目的是想通過提高服務的效能從而提高應用的使用者體驗。

而系統性能的指標一般包括:響應時間、延遲時間、吞吐量、併發使用者數量和資源利用率等幾個方面。

吞吐量:系統在單位時間內處理的請求的數量

3.快取的分類

對於java程式開發者來說,根據快取在軟體系統中所處的位置的不同,快取大體可以分為三類:

  1. 客戶端快取
  2. 服務端快取
  3. 網路中快取

下面主要針對客戶端快取和網路中快取簡單說明,並對服務端快取做詳細說明

3.1客戶端快取

對於BS架構的網際網路應用來說客戶端快取主要分為頁面快取和瀏覽器快取兩種,對於APP而言主要是自身所使用的快取。

3.2網路中快取

網路中的快取主要是指代理伺服器對客戶端請求資料的快取,主要分為WEB代理快取和邊緣快取(CDN邊緣快取)

3.3服務端快取

對於服務端快取而言,從系統的架構上面區分可以將快取分為

  1. 伺服器本讀快取(localCache)
  2. 分散式快取(Redis、Memcached等nosql)
  3. 資料庫快取

3.3.1 伺服器本地快取

本地快取是一級快取,位於服務本機的記憶體中,在操作本地快取的時候不需要網路IO不需要檔案IO,直接從本機記憶體中讀取資料,因此讀寫速度最快。

本地快取存在的問題:

  1. 本讀快取資料直接儲存在JVM中,需要考慮快取資料的大小、JVM的垃圾回收效能消耗
  2. 單服務是叢集部署的時候,應該考慮是否需要做叢集中本地快取的資料同步

在實際的開發中可以自己實現簡單的本地快取也可以使用開源的本地快取框架,比如: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的程式設計師,可來我們的java技術學習扣qun哦:72340,3928,小編花了近一個月整理了一份非常適合18年學習的java乾貨,加入就免費送java的視訊教程噢!而且我每天晚上都會在裡面直播講Java知識,從零基礎學習到有基礎進階,歡迎初學和進階中的小夥伴。