我正在使用SQLite來存儲8-10列的應用程序。我曾經基於任意數量的這些屬性的組合來檢索數據。現在我想移植到Redis。所以我正在爲它構建一個測試應用程序。從SQLite移植到Redis
但我無法想象如何設計我的redis系統,這樣我就可以根據這些屬性中的任何一個來檢索數據。你們誰有任何建議/經驗?
我正在使用SQLite來存儲8-10列的應用程序。我曾經基於任意數量的這些屬性的組合來檢索數據。現在我想移植到Redis。所以我正在爲它構建一個測試應用程序。從SQLite移植到Redis
但我無法想象如何設計我的redis系統,這樣我就可以根據這些屬性中的任何一個來檢索數據。你們誰有任何建議/經驗?
我認爲最好的建議是在從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的靈活性(沒有正則表達式,沒有前綴搜索,範圍查詢是很難處理的,等等......)