2011-09-03 63 views
2

我正在構建由用戶執行以下操作的Web應用程序:存儲大量的會話級數據集?

  1. 瀏覽和搜索對含有數百萬個條目的Solr的服務器。 (這部分應用程序工作得很好。)

  2. 選擇此數據的特權片段(某些特定搜索的結果),並將其暫時保存爲「數據集」。 (我希望數據集大小限制在真的大,比方說50萬個結果。)

  3. 對該數據集執行一些雜項操作。

(的前端內置的Rails的,但我懷疑這是如何解決這方面的問題確實有關。)

第二步,如何檢索步驟3中的數據,是什麼給了我麻煩。我需要暫時保存數據集,在需要時恢復它們,並在一段時間後過期。問題是,我的結果有SHA1校驗和ID,所以每個ID是48個字符。一個500,000條記錄數據集,即使我只存儲ID,也是22 MB的數據。所以我不能只有一個數據庫表,併爲每個用戶構建的數據集引入一行。

有沒有人曾經需要這樣的事情?解決這個問題的最好方法是什麼?我應該爲用戶構建的每個數據集生成單獨的表嗎?如果是這樣,一段時間後過期/刪除這些表的最佳方法是什麼?如果需要的話,我可以部署一個MySQL服務器(儘管我還沒有一個,所有的數據都在Solr中),而且如果還有別的東西符合要求,我也會接受一些更瘋狂的軟件。

編輯:一些更詳細的信息,以迴應傑夫費蘭下面。

數據對象是不可變的,靜態的,並完全駐留在Solr數據庫中。它可能更有效的文件,但我寧願(因爲搜索和瀏覽的原因)保持他們在哪裏。數據和數據集都不需要分佈在多個系統中,我不認爲我們會得到這種負載。現在,整個該死的東西都在一個虛擬機內運行(如果我到達那裏,我可以穿過那座橋)。通過「在需要時恢復」,我的意思是這樣的:用戶運行一個非常精心製作的搜索查詢,從而爲他們提供一組對象作爲結果。他們然後決定他們想操縱那套。當他們(作爲一個隨機例子)點擊「按年份繪製這些對象」按鈕時,我需要能夠檢索全套對象ID,以便我可以將它們帶回Solr服務器並運行更多查詢。我寧願存儲對象ID(而不是搜索查詢),因爲當我們添加更多對象時,結果集可能會在用戶下方更改。

「while」大致是用戶會話的長度。然而,有一個複雜因素可能會影響到:我可能會需要實施一個工作隊列,以便推遲處理,在這種情況下,「只要需要處理您的工作」就需要「時間」。

感謝傑夫刺激我提供正確的進一步細節。

回答

2

第一招:不要將您的SHA1表示爲文本,而應將其表示爲20個字節。您看到的十六進制值是以可讀形式顯示字節的一種方式。如果你正確地存儲它們,你只有9.5MB而不是22。

其次,你還沒有真正解釋你在做什麼的性質。您保存的數據集是否引用現有數據庫中的不可變對象?在需要時恢復它們是什麼意思?談論到期時間「有一段時間」有多久?您引用的基礎數據是靜態的還是動態的?您可以保存搜索模式和偏移量,還是需要保存單個參考?

與會話相關的數據是否需要插入到數據庫中?它可能會更有效的文件?這是否需要分佈在多個系統上?

我的答案還有很多問題。爲此,您需要更好地表達甚至定義您提供的技術概述之外的需求。


更新:對於這個很多可能的解決方案。這裏有兩個:

  • 將這些寫入單個表(saved_searches或類似的),它具有遞增的搜索標識。按照排序順序插入密鑰的獎勵積分。 (search_id unsigned bigint,item_id char(20),主鍵(search_id,item_id)。這將真正限制分段,保持每個搜索聚集在一起,並以大致連續的順序釋放頁面,這幾乎是一個滾動表,這是關於在這種情況下,您需要支付插入費用,並將刪除的費用加倍,您還必須重複整個搜索結果。
  • 如果您的搜索項目具有遞增的主ID這樣對數據庫的任何新插入將比數據庫中已有的任何新插入的值都高,這是最有效的。或者,插入日期戳可以達到相同效果,但效率較低(每一行實際上都必須在查詢,而不僅僅是索引條目)如果你記下了最大的ID,並且你不刪除記錄,那麼你可以保存使用零的搜索通過在保存的查詢上始終設置最大ID來確保空間。
+0

已編輯的問題,讓我知道如果添加的信息有幫助! –

+0

編輯的答案 - 希望有所幫助! –

+0

太棒了 - 謝謝!我沒有考慮過,你可能會得到相當大的吞吐量(類似於滾動表)。 (如你所見,數據庫設計不是我的特長!) –