2014-11-23 199 views
2

我在尋找可處理大數據的內存緩存解決方案(< 5GB)。對於用戶輸入的搜索詞,數據庫(elasticsearch)將返回大量的數據,工具將通過該工具的不同網頁分析和顯示大量數據。現在我的問題是,我想暫時緩存這些大數據,直到用戶會話結束,這樣每次用戶打開一個新頁面時,我都不必從elasticsearch再次獲取它。它將不得不在內存中,因爲基於磁盤將花費一分鐘,這將非常緩慢。緩存內存中的大量數據

我最初認爲memcached,但它的最大限制爲128MB。閱讀了很多後,Redis看起來很合適,但是我不清楚一堆Redis節點是否可以協同工作。是否可以建立多個Redis節點池,以便在SETGET上自動選擇合適的節點,而無需我指定節點?

TL; DR

  • 問題:在內存中緩存緩存大數據(< 5GB)
  • 可能的解決方案:Redis的
  • 問題:我能彙集一堆Redis節點,這樣我就可以在沒有指定特定節點的情況下獲取存儲在其中任何一箇中的密鑰。我不需要分發我的數據,因爲單個用戶的數據將適合單個節點的RAM。
+0

確保您沒有過度優化。 5 GB聽起來像很多數據,但除非是每個用戶,否則其實並不多。 Elasticsearch'filter'結果在默認情況下被緩存(有些例外,如腳本和地理操作),因此後續搜索應該很快返回(除1.4中有少數例外情況外,不會對緩存查詢進行緩存)。 – pickypg 2014-11-24 02:47:45

+0

Yup 5GB是每個用戶。但由於它是一個B2B工具,用戶數量有限。此外,如果用戶數量增加,我可以添加更多的節點,因爲單個用戶的數據仍然適合單個節點的RAM。在elasticsearch中,我使用掃描和滾動,其中的結果,我假設沒有緩存? – huhahihi 2014-11-24 09:13:32

回答

0

Redis集羣聽起來很適合您的用例!

Redis集羣提供了一種通過哈希槽進行數據分片的機制。這些插槽在設置時均勻分佈在羣集中的節點上。

只要您在緩存器中存儲值,就會計算給定密鑰的相應散列槽,並將數據轉發給負責節點。您可以用同樣的方法查詢您的數據。 所以你的問題的答案肯定是肯定的。

但是,每個密鑰的最大值大小爲512MB。我不確定我的存儲需求是否正確。我假設5GB是所有用戶的估計總金額。

結帳redis cluster tutorial

+0

請注意,使用Redis羣集選擇分片是基於對密鑰名稱(或其中的一部分)進行散列處理,而不是基於利用率。 – 2014-11-23 17:40:05

+0

@Moritz不,每位用戶5GB。據我瞭解,512 MB的限制只適用於字符串數據類型,但如果數據保存爲列表,這個限制將不適用?糾正我,如果我得到這個錯誤。 – huhahihi 2014-11-24 09:29:05

+0

@ItamarHaber是否意味着不存在動態負載平衡,並且我將不得不重新啓動羣集以添加新節點?另外,如果節點發生故障,我的數據是否會繼續前往故障節點,因爲該節點已映射到特定的數據段? – huhahihi 2014-11-24 09:31:48

1

您也可以看看NCache(.NET)/ Tayzgrid(JAVA)由Alachisoft

這些解決方案都提供分佈與動態集羣緩存,它允許添加或使用了運行時刪除羣集節點丟失任何數據。智能客戶端也確保參考適當的節點來獲取/存儲對任何密鑰的記錄。