進程內緩存與分布式緩存的比較


在這篇文章里我們將比較當需要對緩存方案進行技術選型時,使用進程內緩存與分布式緩存的優劣。

首先來看一下二者的定義。顧名思義,進程內緩存是與應用程序在相同地址空間的緩存。Google Guava是一個提供了簡單進程內緩存API的很好的例子。另一方面,分布式緩存是應用程序的外部擴展,通常部署在多個節點上,共同構成一個大的邏輯緩存。Memcached是一個流行的分布式緩存。Terracotta公司的Ehcache則是一個通過配置可以以任一種方式使用的緩存產品。

一致性

進程內緩存
當使用進程內緩存時,緩存元素是特定應用程序實例本地的。然而,許多中到大型應用通常會做負載均衡,從而不存在一個作為整體的獨立應用。在這種情況下,很可能會構建出一個有多少應用實例就有多少緩存的解決方案,每個緩存都有各自的狀態,這就導致了不一致性。隨着緩存元素的過期或被逐出,所有緩存實例間可能達到最終一致性。

分布式緩存
分布式緩存,雖然部署在由多個節點構成的集群上,會提供一個單一緩存的邏輯視圖(以及狀態)。多數情況下,分布式緩存中的對象將會存在於集群中的單個節點。通過哈希算法,緩存引擎總是可以判斷出某個鍵值對位於哪個特定節點。由於整個集群總是會有一個特定狀態,所以從來不會存在不一致的情況。

備注
如果你需要緩存不變的對象,一致性將不是一個問題。在這種情況下,進程內緩存是一個更好的解決方案,因為它沒有分布式緩存的典型管理開銷。如果你的應用部署在多個節點上,想要緩存可變的對象同時需要每次讀都是一致的而不僅僅滿足最終一致性,則應當采用分布式緩存。

開銷

進程內緩存
揭開進程內緩存的奧秘 一文中提到進程內緩存可能會影響垃圾回收進而影響系統性能。而這將會由緩存大小以及對象逐出和過期的頻率決定。

分布式緩存
分布式緩存有兩大主要開銷會導致其慢於進程內緩存(但優於無緩存方案):網絡延遲和對象序列化。

備注
正如之前所提到的,如果你試圖尋求一個多節點部署情況下的強一致性緩存解決方案,采用分布式緩存。

可靠性

進程內緩存
進程內緩存使用與應用程序相同的堆空間,因此必須非常小心地決定緩存所能使用的內存大小上限。如果應用程序用光了內存,想要試圖恢復並不容易。

分布式緩存
分布式緩存作為多個節點的獨立進程運行,因此單點故障並不會導致緩存失效。丟失的緩存元素將會在下一次緩存未命中時進入存活的節點。分布式緩存情況下,緩存整體失效的最壞后果是降低系統性能,而不是導致系統整體故障。

備注

進程內緩存適用於較小且頻率可預見的訪問場景,尤其適用於不變對象。對於較大且不可預見的規模的訪問,最好采用分布式緩存。

建議

對於不變對象的較小規模的、可預見次數的訪問,進程內緩存是一個理想解決方案,性能上它優於分布式緩存。然而,對於要緩存的對象數量是未知的並且較大的情況下,同時要求讀一致性,分布式緩存是一個更好的解決方案,盡管它可能具備與進程內緩存相同的性能。自不用說,應用程序可以同時應用兩種類型的緩存,取決於最適用的應用場景。

原文鏈接:In-Process Caching vs. Distributed Caching


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM