客戶端發送一些實時數據到服務器。服務器將使用這些數據進行簡單的分析。它只能找到特定範圍的數據,或者排序一些數據。分析後大部分數據將被廢棄,因此不需要將它們保存在磁盤中。在內存中處理實時數據有什麼好的選擇?
我想用一些內存DB來處理它們。 MYSQL的內存引擎是不錯的選擇?如果我使用Redis這樣的鍵值內存緩存引擎呢?因爲我需要比較數據,也許純粹的鍵值存儲不能滿足我的要求。
客戶端發送一些實時數據到服務器。服務器將使用這些數據進行簡單的分析。它只能找到特定範圍的數據,或者排序一些數據。分析後大部分數據將被廢棄,因此不需要將它們保存在磁盤中。在內存中處理實時數據有什麼好的選擇?
我想用一些內存DB來處理它們。 MYSQL的內存引擎是不錯的選擇?如果我使用Redis這樣的鍵值內存緩存引擎呢?因爲我需要比較數據,也許純粹的鍵值存儲不能滿足我的要求。
對我來說,聽起來好像它沒有數據庫更好,但這取決於你的數據結構和你必須執行什麼樣的操作。
如果結構簡單且操作簡單,那麼您應該將數據存儲在您正在使用的編程平臺的數據結構中。
如果您打算使用MySQL的存儲引擎,有幾個陷阱:
在默認情況下,索引使用哈希表,而不是B樹實現。如果您需要對數據或範圍支持進行排序,則使用btrees可能會更有趣。
鎖定粒度是表格。有一個R/W鎖來防止併發DML操作。儘管原始性能不錯,但如果同時有很多作者,可擴展性並不是很好。
所有行有一個固定的寬度(注意,如果你需要存儲VARCHAR處理...)
此外,像其他大多數RDBMS,MySQL協議是同步的。客戶端每次寫入數據庫時,都會等待回覆。如果你有很多數據,批量寫操作幾乎是強制性的,以獲得良好的性能。
這實際上取決於數量,客戶端數量和吞吐量。如果要求很低,那麼任何存儲解決方案(包括MySQL)都可以正常工作。現在,如果需要更高的性能或更高的可擴展性,那麼其他解決方案可能會更好。
你想寫什麼可能是一個DIRT應用程序(數據密集型實時)。爲此,良好的存儲解決方案是MongoDB(支持upserts,用於寫操作的單向協議等)和Redis(內存中,O(1)操作,流水線等)。 根據您的需求,由於btree索引和map/reduce支持,MongoDB的數據建模和處理可能會更容易。 Redis可能會稍微複雜一些,但如果您選擇正確的數據結構,您將獲得更多的確定性性能。
最後,您可能還想避免通過即時處理數據來存儲數據。您可以使用流媒體引擎(如高速交易平臺上使用的流引擎)來實現此目的。例如,如果您準備使用Java進行編碼,ESPER是一個出色的CEP解決方案,用於處理數據流和/或使用類似SQL的語言在流之間建立關聯。
嗯,你是什麼意思**所有的行都有固定的寬度(小心如果你需要存儲變量。 ..)**? 這是否意味着一行可以擁有的最大列數是固定的或者我在varchar中擁有的最大元素數量不能超過預定限制? –
這意味着varchar將像char一樣存儲。請參閱http://www.percona.com/doc/percona-server/5.5/flexibility/improved_memory_engine.html –
我不打算做一個完整的答案,但你可能會發現MongoDB做你想做的 - 你可以阻止它刷新到磁盤,有效地使它成爲一個內存數據庫。使用的選項是:--syncdelay 0 – Rich