2012-05-29 74 views
1

我正在使用SQLite來存儲8-10列的應用程序。我曾經基於任意數量的這些屬性的組合來檢索數據。現在我想移植到Redis。所以我正在爲它構建一個測試應用程序。從SQLite移植到Redis

但我無法想象如何設計我的redis系統,這樣我就可以根據這些屬性中的任何一個來檢索數據。你們誰有任何建議/經驗?

回答

5

我認爲最好的建議是在從RDBMS移植到Redis時避免堅持關係模型。除了模型之外,一個重要的區別是關注數據訪問路徑以及數據結構。

Redis不包含查詢語言(而是命令la memcached),因此不能回覆任意查詢。如果數據的訪問路徑不是數據結構的一部分,則無法有效檢索數據。

當談到支持任意查詢時,Redis並不是最好的NoSQL存儲。例如,你可以更好地服務MongoDB。

現在,如果你真的想用Redis實現你的東西,你可以嘗試使用類似於標記引擎的策略。您的記錄可以存儲在散列對象中。對於需要支持的任意查詢的每個列部分,可以使用集合建立反向索引。

例如:

# Set up the records: one hash object per record 
hmset user:1 name Bilbo type Hobbit job None 
hmset user:2 name Frodo type Hobbit job None 
hmset user:3 name Gandalf type Maiar job Wizard 
hmset user:4 name Aragorn type Human job King 
hmset user:5 name Boromir type Human job Warrior 

# Set up the indexes: one set per value per field 
sadd name:Bilbo 1 
sadd name:Frodo 2 
sadd name:Gandalf 3 
sadd name:Aragorn 4 
sadd name:Boromir 5 
sadd type:Hobbit 1 2 
sadd type:Maiar 3 
sadd type:Human 4 5 
sadd job:None 1 2 
sadd job:Wizard 3 
sadd job:King 4 
sadd job:Warrior 5 

# Perform a query: we want the humans who happen to be a king 
# We just have to calculate the intersection of the corresponding sets 
sinterstore tmp type:Human job:King 
sort tmp by nosort get user:*->name get user:*->job get user:*->type 
1) "Aragorn" 
2) "King" 
3) "Human" 

通過組合並,交,差,更復雜的查詢可以實現。對於非離散值或基於範圍的查詢,必須使用有序集(zset)(並且可以與正常集相結合)。

如果值足夠區分,此方法通常相當快。請注意,您沒有RDBMS的靈活性(沒有正則表達式,沒有前綴搜索,範圍查詢是很難處理的,等等......)