Redis緩存篇(一)Redis是如何工做的

Redis提供了高性能的數據存取功能,因此普遍應用在緩存場景中,既能有效地提高業務應用的響應速度,還能夠避免把高併發壓力發送到數據庫層。前端

由於Redis用做緩存的廣泛性以及它在業務應用中的重要做用,因此須要系統地掌握緩存的一系列內容,包括工做原理、替換策略、異常處理和擴展機制。redis

今天咱們瞭解緩存的特徵和Redis緩存的工做機制。數據庫

緩存特徵

主要有兩個特徵:後端

一是在一個層次化的系統中,緩存必定是一個快速子系統,數據存在緩存中時,能避免每次從慢速子系統中存取數據。緩存

二是緩存系統的容量大小老是小於後端慢速系統的,咱們不可能把全部數據都放在緩存系統中。併發

Redis緩存處理請求的兩種狀況

把Redis用做緩存時,會把Redis部署在數據庫的前端,業務應用在訪問數據時,會先查詢Redis中是否保存了相應的數據。此時,根據數據是否存在緩存中,會有兩種狀況:異步

  • 緩存命中:Redis中有相應數據,就直接讀取Redis,性能很是快。
  • 緩存失敗:Redis中沒有相應數據,就從後端數據庫中讀取數據,性能就會變慢。

由於Redis是獨立的系統軟件,和業務應用程序是兩個軟件,所以使用Redis緩存時,要在應用程序中增長三方面代碼:高併發

  • 當應用程序須要讀取數據時,須要在代碼中顯式調用Redis的GET操做接口,進行查詢;
  • 若是緩存缺失了,應用程序須要再和數據庫鏈接,從數據庫中讀取數據;
  • 當緩存中的數據須要更新時,也須要在應用程序中顯式地調用SET操做接口,把更新的數據寫入緩存。

下面是一段示例代碼:性能

String cacheKey = 「productid_11010003」;
String cacheValue = redisCache.get(cacheKey);
//緩存命中
if ( cacheValue != NULL)
   return cacheValue;
//緩存缺失
else
   cacheValue = getProductFromDB();
   redisCache.put(cacheValue)  //緩存更新

 

緩存的類型

按照Redis緩存是否接受寫請求,能夠分爲只讀緩存和讀寫緩存。spa

只讀緩存

只讀緩存指讀請求會先通過Redis,寫操做不會通過Redis,可是會刪除相應的數據。當再次讀取數據時,會發生緩存缺失,而後從數據庫中讀取並寫入緩存。

讀寫緩存

讀寫緩存指除了讀請求會發到緩存處理,寫請求也會發到緩存處理。

和只讀緩存不同的是,在使用讀寫緩存時,最新的數據是在Redis中,而Redis是內存數據庫,一旦出現掉電或宕機,內存中的數據就會丟失。

因此,根據業務應用對數據可靠性和緩存性能的不一樣要求,會有兩種策略,分別是同步直寫和異步寫回。

  • 同步直寫,優先保證數據可靠性:寫請求發給緩存,同時也會發給後端數據庫進行處理,等到緩存和數據庫都寫完數據,纔給客戶端返回。
  • 異步寫回,優先提供快速響應:全部寫請求都先在緩存中處理,等到這些增改的數據要被緩存淘汰時,緩存再寫回後端數據庫。

只讀緩存和讀寫緩存的選擇

  • 若是須要對寫請求進行回事,選擇讀寫緩存。
  • 若是寫請求不多,或者是隻須要提高讀請求的響應速度的話,選擇只讀緩存。

只讀緩存和使用直寫策略的讀寫緩存有什麼區別?

使用只讀緩存時,是先把修改寫到後端數據中,再把緩存中的數據刪除。下次訪問時,再從後端數據庫讀取。

  • 優勢:數據庫和緩存徹底一致,緩存中永遠保留的是常常訪問的熱點數據。
  • 缺點:數據刪除後訪問會觸發一次緩存缺失,從後端數據庫加載數據到緩存中,這個過程訪問延時會變大。

使用讀寫緩存時,是同時修改數據庫和緩存中的值。

  • 優勢:被修改後的數據永遠在緩存中存在,下次訪問直接命中緩存。
  • 缺點:在高併發場景下,可能會致使緩存和數據庫的不一致

當數據庫或緩存修改失敗時:

  • 只讀緩存:數據庫和緩存中的數據保持一致
  • 讀寫緩存:可能致使緩存和數據庫的不一致

總結一下:只讀緩存犧牲必定性能,優先保證數據庫和緩存的一致性,更適合對於一致性要求比較高的業務場景。對於數據庫和緩存一致性要求不高,或者不存在併發修改同一個值的狀況,使用讀寫緩存比較合適,保證更好的性能。

參考資料

相關文章
相關標籤/搜索