Ehcache還是Memcached的抉擇(一)

緩存的目的就是爲了提高響應速度,尤其是併發訪問的速度,降低數據庫服務器的壓力,在同等硬件配置的情況下,提供更高的系統性能。

總的來說,請指導原則就是:儘量用低開銷的計算代替高開銷的計算。比如直接從數據庫查詢的開銷要遠高於內存中的計算返回,網絡請求要遠高於本地(同一VM中)請求。

如果單從這一點上來分析的話,現在很多關於Ehcache(local)與memcached(client/server)性能PK的討論是可以比較簡單的得出一個結論的。

(老實說,我對memcached的瞭解只是一知半解。不過國內比較知名的阿里巴巴的系統就是用的memcached,AliSoft有個哥們也在這方面有比較深的研究。詳細請參見:http://blog.csdn.net/cenwenchu79)
 

下面圖是國外一個哥們做的對比,按照Greg的測試,Ehcache的性能不memcached真的高很多,不過其試驗的詳細過程並沒有資料,所以公證性也受到很多人的懷疑。

ehcache對比memcached

因爲在Liferay框架中使用了Ehcache, 對這個緩存框架,我倒是做了一些research, 下面簡單的羅列一下Ehcache在分佈式緩存方面的知識點。

 

Ehcache的分佈式緩存

——在分佈式情況下,一個節點的緩存發生變動,需要通過廣播通知其他節點。Ehcache有兩種通知策略:copy和invalidate。一個是沒有就拷貝過來,比較自然;另外一個是如果沒有,那就反過來連自己也取消,這樣就必須重新到數據庫中查詢,網絡負載低。

——發現機制。也就是發現其他節點的機制,有兩種,一種是利用RFC1112進行廣播,好處是可以動態增減節點,另外一種是維護一個靜態列表(IP)。

——傳遞機制。(Delivery Mechanism) 支持JMS, RMI, TCP, UDP, 廣播,JXTA, JGroups。 缺省是RMI。

——複製的缺陷和Ehcache的解決辦法

☆ 碎嘴的通訊協議(Chatty Protocal)

因爲是一個網狀拓撲,一個節點的每個變化需要通知其他N-1個其他節點,造成網絡較大的負載。
可以通過批量異步操作來降低負載。加快對客戶端的響應。
 

☆ 冗餘的通知
發起通知的不應該收到並處理通知。(因爲是廣播,所以會收到)
可以通過爲每個Cache創建一個GUID來標明身份,這樣如果發起的Cache GUID與自身相同,則不用處理。
 

☆ 潛在的數據不一致
這是一個比較大的問題。只要是分佈式存儲,就一定會遇到這個問題。造成這個問題的原因有很多,比如對同一Cache的同一數據進行並行更新等;
解決的辦法是通過:同步傳遞。客戶端請求先處於掛起狀態,在同步傳遞並在所有緩存中數據都同步之後再返回。
 

☆ 使緩存數據失效以實現更新(Update via Invalidate)
默認的方式是一個緩存的數據被更新之後,就將新數據複製給其他所有緩存。
另外的方式是,如果緩存數據被更新,則清除所有節點緩存中對應的數據,重新到數據庫中查詢。並重新加載到所有的節點緩存中。(Liferay就是採用了這種方式)
另外的一種保證數據一致的方式就是:設置TTL值(time to live), 到期之後重新從數據庫中更新;

 

自己的一些設想

在研究關於分佈式緩存的時候,我不由得想起來分佈式數據庫存儲來。這兩者有很多相似的地方,最核心的問題就是保持數據的一致性問題。

當前,在數據的分佈式存儲方面的解決方案已經有很多,很多產品、技術都很成熟,是否有一些東西可以借鑑在這裏呢?比如說,內存數據庫,數據庫鎖,消息中間件等等。

巧的是,上面那個做對比的哥們Greg就這個問題有不同的看法。

 

My point is that caches are not meant to have full database-like semantics. It is usually acceptable for the data to be dirty or stale to some extent. That extent depends on the app.

 

確實,確保每個緩存中的數據完全的一致是不可能的,總會存在這樣那樣的問題,即使像memcached,也因爲沒有commit機制,可能出現一個node上先放入cache,而最後transaction回滾,但其他的cache node已經爲其他用戶提供了這個數據。

所以,分佈式緩存還只能是具體問題具體分析了。

另外,簡單地總結一下memcached的features如下:

1、請求由client端進行處理,client端維護着一個memcached服務器列表,根據用戶的請求將響應指向不同的memcached服務器;(也就是說,每個緩衝值,在所有服務器中只保持着一份copy,不像ehcache每個服務器中都有)

2、memcached對CPU的要求不高,但對內存要求較高,因此可以與webapp server安裝在一起,互補(web app server是CPU要求高,內存要求低)

3、可以動態地,甚至無限地增加memcached服務器的數量

發佈了112 篇原創文章 · 獲贊 10 · 訪問量 52萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章