2012-10-10 28 views
1

如果我有簡單的關係 (95%的查詢依賴於ID),使用數據庫的確切點是什麼。數據庫或數組

我正在存儲用戶及其統計信息。

爲什麼要使用外部數據庫,如果我能有整齊的建築,如:

db.users[32] = something

500K用戶的陣列是不是RAM那麼大力氣

優點是:

  • 不存在問題的異步性(即時結果)
  • 易出口/進口
  • 處理數據庫就像一個原生對象LITERALLY

PS。和注意事項:

  • 它會更快或更慢做collection[3]db.query("select ...
  • 我將它保存爲一個文件/秒
  • 只有一個應用程序/處理訪問這些數據,以及代碼逐行執行 - 請不要詳細說明鎖定。
  • 請不要回答數據庫命題,但爲什麼要使用外部數據庫通過本機數組/對象 - 我有一些數據庫的經驗 - 事實並非如此。
  • 我正在構建的是客戶端/網關/服務器(S)遊戲。網關處理所有用戶數據,處理,認證,編寫統計信息e.t.c無需其他部分軟件直接訪問此數據/數據庫。
+0

如果您的應用程序崩潰,該如何恢復?數據庫往往是矯枉過正的,但是它們的ACID屬性在很多情況下都派上用場。 –

+0

「沒有問題的異步性(即時結果)」 - 如果你在任何點共享線程之間的數組,這個聲明是明顯錯誤的 – millimoose

+0

研究MongoDB的構造這樣的。它是非關係型的,您可以存儲任何類型的JSON格式的數據,而不需要任何類型的模式限制。 **編輯:**只是意識到你有你的標籤中的Mongo。 –

回答

2

它取決於對數據的耐久性,延遲和使用壽命的要求。在內存中訪問數據結構幾乎總是比跳到外部數據庫的網絡快得多,但有些事情需要考慮。

您可以僅將其保存在內存中,但如果您的流程因某種原因而回收,則不再有效。這可能對你的場景是好的...

如果您有多個前端/進程負載平衡(而不是分區)或者沒有關聯性,那麼您也可能會遇到問題。在這種情況下,在內存狀態下可能會出現問題。還有像memcached這樣的選項來解決這類問題。

memcached是Facebook的是如何解決這類問題:http://www.facebook.com/note.php?note_id=39391378919

與Facebook類似,你也可以在數據庫中持久化數據(無論是SQL或NoSQL的喜歡的MongoDB)和高速緩存在內存中的效率。如果你在內存中緩存,並且它由數據庫支持,那麼你不得不擔心數據的延遲以及如何刷新它。 memcached也是這樣的場景的解決方案。無論是或者你寫自己的機制捎帶回數據,有輪詢(儘量避免)等等......這基本上是fb在做什麼 - 使用數據庫,但卸載分佈在內存緩存中的數據庫負載。從那篇文章:

memcached是一個高性能,分佈式內存對象緩存 系統。在Facebook上,我們很可能是全球最大的 memcached用戶。我們使用memcached來緩解數據庫負載。

+0

對我而言,一個巨大的挑戰是您必須處理所有數據鎖定,除非您正在執行不可變數據。 – Suroot

+2

@Suroot - 同意 - 回到數據要求。如果你使用數據庫,他們經常提供鎖定,或許內存緩存是隻讀緩存,帶有一些延遲?取決於......這裏沒有人正確的答案。 – bryanmac

+0

我同意沒有一個正確的答案。我的意見更多地與評論員Michael Stum更加一致,他指出數據庫將提供ACID兼容性並將處理您的併發修改(處理在寫入期間鎖定數據)。 – Suroot

1

這將是一個比任何事情都更加審慎的答案。你需要在這裏考慮的一件事是你的語言。我是一名PHP程序員,對於數據庫我很高興。

試圖將內存中的500K用戶數組存儲在PHP中(並對其進行操作)將是一場生活的噩夢,事實上它可能會適用於大多數語言。數據庫採用搜索策略來克服這種根據預定義索引使用對數時間函數的場景。

你也有成本因素。將其存儲在同一臺服務器上的MySQL或MongoDB數據庫中實際上更便宜,因爲您很可能需要更少的內存來存儲信息。

我會在這樣一個數組的負載下認真測試你的內存消耗,我也猜測這只是一個很多的數組,對嗎?

難道是更快或更慢做集合[3]比db.query(「選擇...

現在要看,我不能確定的node.js如何處理陣列和迭代到它們中的特定索引,但某些語言不會在索引上執行O(log n)搜索,這意味着您只需執行O(n)搜索,實際上它會比直接調用索引一個SQL表,足夠公平,考慮到SQL創建結果集需要花費的時間,將其寫入磁盤,然後響應node.js來提取它,並且可能會更慢。

因此,node.js肯定會在小索引或對象上更快,但在更大的一個上......我不確定。

只有一個應用程序/進程訪問此數據,並且代碼逐行執行 - 請不要詳細說明鎖定。

這是令人驚訝的。在此之前,我已經輕鬆地啓動了多個node.js服務器。事實上,要保持理想的虛擬主機環境,如果主服務器出現故障,您應該始終準備好另一臺服務器(這相信我會......)。考慮到這一點,我認爲這是一種奇怪的事情,您沒有在這裏考慮鎖定和分佈式數據的中央存儲點。

+0

在多進程節點上,同意。請注意,爲了在生產環境中執行多個內核,您需要使用類似羣集(每個內核啓動一個進程)。過程也會像永遠那樣回收,所以我認爲Ops認爲只有一個過程對於生產來說有點幼稚。 – bryanmac

+0

@bryanmac @bryanmac我從來不知道關於多核設置,所以即使他希望使用現代服務器的全部功能,他也會發現實際上他需要一箇中央數據存儲,它本身就可以回答這個問題:)(我必須承認我只有使用node.js作爲一種側語來做一些輪詢等) – Sammaye

+0

更多的信息在這裏:http://nodejs.org/docs/latest/api/cluster.html – bryanmac