2012-02-21 122 views
2

我有大約50000個json對象存儲在Redis中。 這適用於通過其唯一鍵找到對象的主要用例。將數據存儲在Redis和/或關係數據庫中

我現在必須添加一個功能來根據基於對象數據的複雜查詢來搜索對象。例如,2011年1月1日至2012年1月12日期間發佈的所有與作者一樣的「lex」,超過5件商品。

用SQL這很簡單。 我不太瞭解Redis,但沒有看到過這樣的事情。

所以我正在考慮建立一個小型關係數據庫,在那裏我會存儲Redis鍵和我需要搜索的數據。當需要複雜的查詢時,我點擊SQL並獲取一組密鑰以從Redis中退出。

我改變的數據不多,我會知道什麼時候發生了變化。所以我可以在更新時將數據導入到rmdb和Redis中。

這種方法是一個好主意嗎?

+0

爲什麼不能完全切換到關係數據庫? 50k對象不算什麼,任何數據庫都可以處理。 – 2012-02-21 14:52:47

+2

如果你還想存儲JSON,我推薦[MongoDB](http://mongodb.org)。 – 2012-02-21 14:53:23

+0

我有json格式的數據,我將它提供給其他需要json格式的程序。看起來奇怪的是有一個數據庫將它映射到表,然後重新將它重新生成爲json,當時它只是一個鍵值查找。 – Cogslave 2012-02-21 14:56:04

回答

3

你需要的是一個文檔數據庫(NoSQL的一個優惠)。

正如@Sergio建議的,MongoDB就是其中之一。還有其他人(CouchDB,RavenDB以及更多),你必須檢查看看哪個最適合你。他們在性能,複製能力,穩定性,成熟度不同,支持等

+0

我現在有機會對MongoDB進行原型化,對於這個特殊的用例,它似乎比我的想法更適合。 – Cogslave 2012-02-22 10:35:03

5

是查詢動態?因爲您可以在Redis中構建結構,執行您所描述的查詢。例如,使用Ordered集合的時間,爲庫存號碼設置另一個有序集合,查詢並相交它們。如果你知道你想要運行什麼搜索,你可以讓Redis爲你做的速度非常快。如果查詢總是發生變化(播放數據,分析數據等),那麼它不是一個很好的解決方案。因此,對於存儲的東西

set key object1 

zadd time_set object1.time object1 
zadd inventory_set object1.inventory object1 

查詢時間和庫存

zrangebyscore time_set min_time max_time 
zrangebyscore inventory_set min_inventory max_inventory 

Then you intersect them yourself, since results are just ids this is really fast. Once you intersected them just do an 

mget item1, item 2... 

一般Redis的

的作品真的很好,當你確切地知道你查詢將在它運行。