2017-09-18 108 views
1

我還是NoSQL數據庫的新手,多年來一直在使用RDBMS(Oracle,MySQL)。現在,我們正在考慮將我們的一個數據庫遷移到內存中的NoSQL DB,並且我們堅持採用最佳設計方法。NoSQL(Redis)設計建議

我們正在考慮Redis,但是否會與另一個Key-value商店(如RocksBD或LMDB)一起使用,或者最好單獨使用它們將基於我從您那裏得到的建議。 (您可以通過完全不同的方法來解決我們的問題。

遷移到內存中的NoSQL表包含人口統計信息(例如名字,姓氏,地址,出生日期,出生國家等等約40個不同的人口統計字段)和生物特徵數據,如照片,簽名和全部10個指紋。

查詢將人口統計如檢索其中姓名=「瓊斯」和姓氏=「安德烈」和出生日期> 1984年9月13日

我們可以很容易地保存在redis的鍵值存儲一切(包括照片運行,簽名,指紋和所有人口統計數據),但我們擔心它需要大量的RAM,特別是因爲DB最終會增長到大約2億條記錄。因此,我們考慮存儲一些在redis中頻繁搜索的人口統計數據(例如,名字,姓氏,生日等),然後將其餘數據存儲在鍵值存儲中,如LMDB或RocksDB(因爲這當然需要遠內存少於redis)。在這個實現中,當有人想要檢索firstname = jones和lastname = mark時,它會搜索redis,獲取檢索到的記錄的id,然後從鍵值存儲區(lmdb或rocksDB)中取回這些記錄。 我們主要關心的是閱讀性能,對於編寫很少擔心。 我們希望閱讀速度非常快。

  1. 這是一個很好的設計方法,或有人建議更好的設計方法,將導致更好的性能。請記住,目標是最大限度地減少內存需求並獲得非常好的讀取性能。

  2. 順便說一句,這是一種很好的方法來存儲這種性質的生物識別技術嗎?

  3. 怎麼都是這樣challanges解決

還要注意的是,雖然我們對查詢的人口,做檢索的一個子集,我們主要檢索整個數據集的。 (即每個匹配的個體我們檢索其他人口統計和生物特徵)

+0

請閱讀[在什麼情況下我可以添加「緊急」或其他類似的短語到我的問題,以獲得更快的答案?](/ meta.stackoverflow.com/q/326569) - 總結是,這不是解決志願者問題的理想方式,而且可能對獲得答案起反作用。請不要將這添加到您的問題。 – halfer

+0

不知道條件如name ='jhon'&& last ='doe'將在key-value存儲中實現,redis是否支持這一點? – ren

+0

是的。 redis支持這種搜索 – SWILL

回答

0

我是Redis的忠實粉絲,因爲它是一款出色的存儲和索引工具。據我所見,你的需求並不適合100%的NoSQL設計。

我可能會建議將數據保存在SQL中,並使用Redis構建複合索引。在Redis中獲取PK查找超快SQL(PostgreSQL)並通過PK索引數據。你不會有任何內存使用的問題,一切都將最終運行多個PK查詢來獲取大量的數據。或者您可以應用策略來僅索引/緩存CHARS列,並將圖像和超大值保留在SQL中。或臨時緩存已訪問的大小的數據,並驅逐最近未訪問的數據的密鑰。

關於內存,您指出的內容是使用Redis Cluster解決的。

[更新]通常我會嘗試爲每個需要索引的值創建一個Redis鍵;如果您需要索引字符串,請使用單聲道分類排序集並利用ZINDEXBYRANGE,對於日期時間,您可以將分數設置爲時間戳並使用ZRANGEBYSCORE。根據您的訪問/存儲模式,您可以決定存儲部分數據,並將批量保留在SQL中。關於速度,我不能說,因爲它取決於你決定如何設計你的鍵/值和你可以分配多少內存來完成任務。

+0

非常感謝您的意見。你的建議需要維護一個RDBMS和一個No-sql數據庫。如果它是最好的前進方向,那將會被考慮。 Howerever,我知道redis支持這樣的搜索(即,如果索引值被查詢,例如firstname ='jones'和lastname ='eva'和dateofbirth> 1984年9月12日)。您是否認爲redis在這些查詢中表現不佳?你認爲做兩個調用來獲取記錄(首先調用rdbms,另一個調用redix)會比在redis上調用更好嗎? – SWILL

+0

@SWILL查看回復更新 – tuned

0

如果您的要求是存儲200毫升記錄並在不同條件下儘快找回它們,那麼確定最適合您的設計的唯一方法是嘗試它作爲概念的證明。

儘管如此,似乎關係數據庫與適當的索引是最好的選擇,特別是如果你有它的經驗。

作爲另一種選擇,您可以將數據分佈到多臺機器上,但這是困難的。

+0

非常感謝您的輸入 – SWILL