天天看點

分布式緩存全面詳解(看這篇就夠了)

作者:mikechen的網際網路架構
分布式緩存全面詳解(看這篇就夠了)

分布式緩存已經成為了網際網路架構的基石,其重要性不言而喻,而且大廠面試也是必考内容,本篇就重點來談談分布式緩存@mikechen

為什麼要使用分布式緩存

高并發環境下,例如典型的淘寶雙11秒殺,幾分鐘内上億的使用者湧入淘寶。

這個時候如果通路不加攔截,讓大量的讀寫請求湧向資料庫,由于磁盤的處理速度與記憶體顯然不在一個量級,伺服器馬上就要當機。

緩存可以将經常讀取的資料存儲在快速的記憶體中,進而避免了頻繁通路慢速的後端資料庫。

這樣可以大幅減少資料庫的負載,加快資料通路速度,提升應用程式的響應性能和吞吐量。

除了提升性能之外,分布式緩存還可以水準擴充。

即通過添加更多緩存節點,來應對不斷增長的資料通路需求。

是以,分布式緩存技術就誕生了。

分布式緩存全面詳解(看這篇就夠了)

分布式緩存應用場景

特别是在大規模和高并發的應用程式中,都是典型的分布式緩存應用場景

1.熱門資料

比如:網站首頁、熱門商品、熱門文章等,可以将其緩存在分布式緩存中,避免每次請求都要重新生成或通路資料庫,進而提高響應速度。

2.分布式session

對于需要維護使用者會話狀态的應用程式,可以将使用者會話資料緩存起來。

3. 分布式鎖

分布式緩存可以用來實作分布式鎖,Redis就經常涉及。

4.頁面緩存

比如HTML、CSS和圖檔等資訊。

分布式緩存比較:Memcache VS Redis

Memcache和Redis都是流行的分布式緩存解決方案,它們都可以用于加速應用程式的資料讀取,并降低資料庫的負載。

下面是兩者的核心差別點:

1.資料結構支援

Memcache:它是一個簡單的鍵值存儲系統,支援字元串類型的值。

Redis:它是一個進階的鍵值存儲系統,支援多種資料結構。如:字元串、清單、集合、有序集合、哈希等,這使得Redis在一些場景下更為靈活。

2.持久化

Memcache:不支援資料持久化,一旦重新開機或崩潰,資料将會丢失。

Redis:支援持久化選項,可以将資料存儲在硬碟上,保證資料的持久性。Redis提供了3種持久化方式:RDB快照和AOF日志,以及RDB快照和AOF的混合版。

3.記憶體管理

Memcache:使用Slab Allocation,預先配置設定一系列大小固定的組,然後根據資料大小選擇最合适的塊存儲,避免了記憶體碎片。

Redis:使用更複雜的記憶體管理機制,可以有效地優化記憶體使用,并支援更多的資料結構,但在一些情況下可能會消耗更多記憶體。

4.釋出/訂閱功能

Memcache:不支援釋出/訂閱模式。

Redis:支援釋出/訂閱功能,可以用于實作實時消息傳遞和事件通知。

5.複制和高可用性

Memcache:不支援資料複制,是以在節點發生故障時可能會導緻資料丢失。

Redis:支援主從複制,可以設定多個從節點來複制主節點的資料,提高了高可用性。當主節點故障時,可以自動切換到從節點以保證服務的可用性。

6.叢集方案

Redis叢集解決方式也優于Memcache,Memcache在用戶端一緻性hash的叢集解決方案,Redis采用無中心的伺服器端叢集解決方案。

分布式緩存選型總結

由于Redis更好的支援持久化、叢集部署,以及支援更加豐富的資料結構,綜上所述選擇Redis會更優。

分布式緩存的常見問題和挑戰

1.緩存雪崩

緩存雪崩我們可以簡單的了解為:由于原有緩存失效,新緩存未到期間(例如:我們設定緩存時采用了相同的過期時間,在同一時刻出現大面積的緩存過期),所有原本應該通路緩存的請求都去查詢資料庫了,而對資料庫CPU和記憶體造成巨大壓力,嚴重的會造成資料庫當機。進而形成一系列連鎖反應,造成整個系統崩潰。

2.緩存穿透

緩存穿透是指使用者查詢資料,在資料庫沒有,自然在緩存中也不會有。這樣就導緻使用者查詢的時候,在緩存中找不到,每次都要去資料庫再查詢一遍,然後傳回空(相當于進行了兩次無用的查詢)。這樣請求就繞過緩存直接查資料庫,這也是經常提的緩存命中率問題。

3.緩存預熱

緩存預熱這個應該是一個比較常見的概念,相信很多小夥伴都應該可以很容易的了解,緩存預熱就是系統上線後,将相關的緩存資料直接加載到緩存系統。這樣就可以避免在使用者請求的時候,先查詢資料庫,然後再将資料緩存的問題!使用者直接查詢事先被預熱的緩存資料!

4.緩存更新

除了緩存伺服器自帶的緩存失效政策之外,我們還可以根據具體的業務需求進行自定義的緩存淘汰,常見的政策有兩種:

(1)定時去清理過期的緩存;

(2)當有使用者請求過來時,再判斷這個請求所用到的緩存是否過期,過期的話就去底層系統得到新資料并更新緩存。

兩者各有優劣,第一種的缺點是維護大量緩存的key是比較麻煩的,第二種的缺點就是每次使用者請求過來都要判斷緩存失效,邏輯相對比較複雜!具體用哪種方案,大家可以根據自己的應用場景來權衡。

5.緩存降級

當通路量劇增、服務出現問題(如響應時間慢或不響應)或非核心服務影響到核心流程的性能時,仍然需要保證服務還是可用的,即使是有損服務。系統可以根據一些關鍵資料進行自動降級,也可以配置開關實作人工降級。

降級的最終目的是保證核心服務可用,即使是有損的。而且有些服務是無法降級的(如加入購物車、結算)。

在進行降級之前要對系統進行梳理,看看系統是不是可以丢卒保帥;進而梳理出哪些必須誓死保護,哪些可降級;比如可以參考日志級别設定預案:

(1)一般:比如有些服務偶爾因為網絡抖動或者服務正在上線而逾時,可以自動降級;

(2)警告:有些服務在一段時間内成功率有波動(如在95~100%之間),可以自動降級或人工降級,并發送告警;

(3)錯誤:比如可用率低于90%,或者資料庫連接配接池被打爆了,或者通路量突然猛增到系統能承受的最大閥值,此時可以根據情況自動降級或者人工降級;

(4)嚴重錯誤:比如因為特殊原因資料錯誤了,此時需要緊急人工降級。

以上

更多分布式架構系列、阿裡架構師進階系列,請檢視以下文章:

阿裡架構師進階從0到1全部合集(建議收藏)

分布式緩存全面詳解(看這篇就夠了)

該合集涵蓋了Java架構必備技能,特别是一線網際網路大廠經常涉及的:

  • 單點登入
  • 負載均衡
  • 雙11秒殺
  • 分布式架構
  • 微服務架構
  • 高并發架構
  • 大資料量..等大廠架構技術

繼續閱讀