2010-06-20 27 views
6

我有一個java web應用程序,它使後端使用第三方web服務。調用Web服務會產生延遲,這對於儘可能避免重要。另外,我的應用程序只允許每天進行一定數量的Web服務調用,因此除非絕對需要,否則最好不要進行Web服務調用。同時使用RAM和磁盤的類似memcached的鍵/值緩存

我現在的解決方案是將Web服務結果緩存在Memcached中,這很好。基本上,我們正在利用RAM來緩存Web服務結果。

但是,我們希望把它帶到下一個層次。我們還有磁盤空間,我們希望將其用作緩存Web服務結果的磁盤緩存。我想要一個系統首先檢查RAM緩存(可能是Memcached,但不一定是)。當一個RAM緩存未命中發生時,我們會回到檢查磁盤緩存。而當磁盤緩存未命中發生時,我們會回到調用Web服務。無論何時我們檢索新的Web服務結果,我們都會更新RAM緩存和磁盤緩存。

一種可能性是將SQL數據庫用作使用磁盤進行存儲的系統的一部分。但這似乎並不理想。數據庫往往需要大量的保姆。它們通常涉及無限制增長的文件(數據庫本身或事務日誌),因此您需要管理在這些增長文件開始導致文件系統耗盡空間時發生的情況。

我想要的是系統中基於磁盤的部分,我可以告訴它使用多少磁盤空間,並且可以保證永遠不會使用更多的磁盤空間。當空間用完時,它會自動開始丟棄最近最少使用的鍵值對。我絕對不需要ACID,所以應該沒有事務日誌。

所以我要尋找兩種: 1)基於磁盤的鍵值存儲系統,可以爲「故障」時,Memcached的具有高速緩存未命中 OR 2)單系統,該系統將取代Memcached和行動提供RAM緩存和磁盤緩存。

我想要的其他重要特質: 1)像Memcached一樣,我想要一個不需要保姆的緩存系統。 2)像Memcached一樣,我希望緩存在多個服務器之間進行分片,每個對象只能位於一臺服務器上。 3)像Memcached一樣,我想要一些相當容易插入和使用的東西。我不想寫一大堆代碼來實現這個工作。

我已經看過的其他系統: 1)我相信Redis不適合這裏的賬單,因爲它的磁盤緩存只是RAM中的內容的鏡像。我希望RAM緩存成爲磁盤緩存的一小部分。 2)EhCache有一個「在VM重啓之間存儲數據的持久磁盤存儲」,但這與我上面描述的不一樣。 (Java緩存系統)看起來可能是一個很好的選擇,所以我很樂意聽到那些使用它的人的意見。

回答

5

我用ehcache基於RAM/DISK的緩存,這工作得很好。確定需要在內存中保留多少對象以及在磁盤上保留多少對象的確切配置可以在代碼之外完成,而不需要更改任何代碼。沒有什麼可說的,它是一個緩存,它工作得很好。

我用它來存儲晶圓地圖,以避免從遠程數據庫獲取它們。我調整磁盤緩存的大小以便能夠在應用服務器附近保留數月的生產時間,從而節省大量時間,特別是在必須完成一些緊急返工時。

+1

謝謝。這可能是我正在尋找的解決方案。我現在看到您可以配置DiskStore並指定maxElementsOnDisk參數。 – 2010-06-21 02:25:00

0

MemcacheDB可能是你正在尋找的答案。 Reddit將其用於「permacache」。

+0

Reddit實際上刪除了Cassandra的memcachedb:http://blog.reddit.com/2010/03/she-who-entangles-men.html – 2010-06-21 23:45:03

0

Cassandra。有超過一打的NoSQL解決方案存儲在內存和磁盤上。幾乎沒有人像卡桑德拉一樣經過戰鬥考驗。使用facebook,reddit和digg製作,僅舉幾例。

0

使用Redis,它支持所有的memcache操作,並將數據保存到磁盤,並且速度非常快。卡桑德拉的閱讀速度很慢,所以我不會那麼做。

-1

難道魷魚是一個選擇嗎?它在cahand cahces網頁結果中的內存和磁盤