2011-09-14 84 views
4
parent = { 
    child0: { 
     data1:'foo', 
     data2: 'bar' 
    }, 
    child1: { 
     data1:'foo', 
     data2: 'bar' 
    }, 
    child2: { 
     data1:'foo', 
     data2: 'bar' 
    } 
} 

起初我想我會設置一個parent:child鍵,因爲我需要單獨的兄弟姐妹的數據。但在某些情況下,我需要返回父代中的所有數據。我應該如何將此對象存儲在Redis中?

我應該把整個物體放在parent的鑰匙上嗎?

如果有很多獲取和設置可能只適用於它的一個孩子,是否有缺點?

有沒有辦法用parent:child模式調用所有父數據?

謝謝!

回答

2

嘗試哈希 - 讓你HGET得到只有一個孩子和HGETALL得到他們所有。

將整個對象作爲JSON存儲在單個鍵中也是有效的,並且如果您的使用情況非常合適,則會使代碼變得簡單。如果數字不是太大,即使只需要顯示一個子對象,也可以始終檢索整個對象。

避免將複雜對象存儲在單個鍵中的主要原因是寫入衝突 - 如果兩個連接可以同時修改一個對象的不同子項,那麼散列將更不麻煩。

+0

啊,是的,所有的孩子對象都會被同時編輯。我應該儘可能地避免這一個單一的關鍵? – fancy

+0

yes - redis速度足夠快,以至於衝突不太可能發生,但是它們會在最方便的時候發生並且很難找到錯誤。使用散列或多個鍵每個項目是獨立的,所以衝突是不可能的。 –

+0

好吧,如果我使用哈希功能,可以在兩個不同的孩子同時更改時緩解衝突。 – fancy

0

您可能會考慮利用散列數據類型。使用父項作爲散列的關鍵字,併爲所有子項使用(HGET鍵字段)或(HKEYS鍵)。

如果有人會發佈散列命令HSET和HGET的基準測試會很有趣。列表操作的基準(LPUSH 88109.25/sec)比(SET 114293.71/sec)慢了(〜23%)。儘管列出了O(1),但推測HSET仍然較慢。

因此,我認爲你可以通過查看代碼中完整家庭請求與個別子請求的比率來加快優化決策。

+0

感謝您的建議。如果兒童進程本質上會同時被設定,會怎麼樣? HGET/HSET可以管理這些差異嗎? – fancy

+0

雖然我第一次以爲你在談論事務,但我認爲HMSET命令是你在同時設置多個哈希值(子)時所要查找的。 –

相關問題