2012-07-15 111 views
2

我有一個應用程序在Ubuntu Linux 12.04上運行需要存儲和檢索大量的大型序列化對象。目前,商店是通過簡單地將序列化的流保存爲文件來實現的,其中文件名等於序列化對象的md5散列。不過,我想加快將文件存儲替換爲內存中緩存最近讀取/寫入的對象的速度,並且最好爲我做散列。memcached像磁盤持久化軟件

我的應用程序的設計不應該更復雜。因此,最好是以抽象和有效的方式管理鍵值數據庫和緩存的存儲後端。我有點迷失在那裏的所有關鍵/價值商店,而且很多主題/信息似乎已經過時。我最初正在尋找像memcached + membase這樣的東西,但也許有更好的解決方案。我看着redis,mongodb,couchdb,但是我不清楚它們是否適合我的需求。

我最重要的要求:

  • 透明保存到持久性存儲的方式,最近讀/寫的對象是可迅速通過在內存中緩存自動它們。
  • 存儲應該在重新啓動後存活。因此,在內存中,對象應儘快保存在磁盤上。
  • 目前我正在手動計算md5。如果後端爲我做這件事,那實際上會更好。因此能夠在存儲對象時獲取散列鍵,並且能夠稍後使用散列鍵檢索對象。
  • 更重要的是,如果有可用於Ubuntu 12.04的軟件包,無論是在Universe中還是通過啓動板或其他軟件。
  • 除此之外,該軟件最好是光不能超過必要的複雜(我不需要分佈地圖,減少就業機會等)

感謝您的諮詢!

+0

應用程序是將這些本地存儲到它運行的計算機,還是計劃與服務器通信以存儲這些對象?您列出的所有技術都是服務器位。要運行應用程序並在本地存儲,除了應用程序之外,還需要在本地安裝和運行服務器。 – 2012-07-15 19:24:02

+0

操作系統在文件上進行內存中緩存,所以這個系統沒問題。 – 2012-07-15 23:14:04

回答

0

我想看看MongoDB。它使用您的操作系統高效地緩存事物,以便將數據分頁和分頁,而且安裝起來非常簡單。Redis和Memcached將不會是您的好解決方案,因爲它們將所有內容都保存在RAM中。其他更簡單的解決方案,如LevelDB或BDB也可能適用。我不認爲任何數據庫會自動爲你計算散列值。聽起來你已經有了這個代碼。

1

我通常會建議Redis,因爲它將快速並且內存與異步持久存儲。另外,你會發現你可以使用不同的數據類型用於其他目的,所以不會像memcached那樣具有單一用途。就自動散列而言,我不認爲它是這樣做的,因爲當你存儲對象時(如在其中大部分),你定義了你自己的鍵。

Redis的一個缺點是,如果你存儲了二進制對象的TON,你將被限制在RAM中的可用內存(除非分片),因此可能會達到性能限制。在這種情況下,您可以將對象存儲在文件系統上,對它們進行散列,並將密鑰存儲在Redis中,並將其與存儲在文件服務器上的文件名相匹配,您會沒事的。

-

一種替代選擇是將檢查出ElasticSearch這就好比蒙戈在於它存儲對象天然如JSON,但它包含與的RESTful API接口頂部Lucene搜索引擎。它「加熱」內存中的數據以實現快速響應,但也是一個持久存儲區,最好的部分是自動分片和自動羣集使用多播來查找其他節點。

-

希望有所幫助,如果是這樣,分享愛! ;-)

+0

對於ElasticSearch,順便說一句,您需要將Java添加到您的堆棧。您可以爲他們的網站上引用的ES構建RPM。 – 2012-07-15 12:24:57

+0

對象非常大,並且它們的集合將很快超出RAM。此外,商店應該在重新啓動後生存Redis能夠很好地將所有內容卸載到磁盤上,或者只是在內存中存儲? – Jeroen 2012-07-15 12:39:46

+0

Redis使用快照或重做日誌保留到磁盤,但不會卸載數據。他們必須適應記憶。請參閱http://redis.io/topics/persistence – 2012-07-15 18:06:17