2011-04-20 293 views
22

我需要保存的用戶模型,是這樣的:Redis的性能,存儲JSON對象作爲字符串

{ "nickname": "alan", 
    "email": ..., 
    "password":..., 
    ...} // and a couple of other fields 

今天,我用的套裝:用戶
在這一套,我有一個用戶成員:艾倫
在這個成員,我有以上

散列這是工作正常,但如果不是上面的方法,可以使感覺使用下面一個我只是想知道:

還在用我們ERS集(輕鬆搞定用戶(成員)名單)
在這組只使用一個鍵/值存儲,如:

鍵:艾倫 值:上述用戶的散列的字符串化版本

檢索一個記錄會更容易(我將不得不用JSON解析它)。

我對redis非常陌生,但我不確定什麼是最好的。你怎麼看 ?

回答

20

您可以使用Redis hashes數據結構來存儲您的JSON對象字段和值。例如你的「用戶」組仍然可以被用來作爲存儲所有用戶和您的個人JSON對象可以存儲到哈希像這樣的列表:

db.hmset("user:id", JSON.stringify(jsonObj)); 

現在,您可以通過密鑰的所有用戶或指定一贈(您只能從中獲取/設置指定的字段/值)。還有thesetwo問題可能與您的情況有關。

編輯:(對不起,我不知道,我們談到了這個更早)

檢索記錄,然後會更容易(那麼我將不得不與JSON解析它)。

這是真的,但有了散列數據結構,您只能獲取/設置需要使用的字段/值。如果只想更改對象的一部分(其他問題是每次需要對對象進行字符串化/解析),則檢索整個JSON對象可能會導致性能下降(取決於您多久執行一次)。

+0

是的,你是對的。我明白了你的觀點。謝謝 – Luc 2011-04-20 12:57:00

2

說實話,無論哪種方式工作正常。您存儲它的方式是您需要制定的設計決策。這取決於你想如何檢索用戶信息等

在性能方面,存儲用戶對象的JSON編碼版本將使用較少的內存,並採取更少的時間用於存儲/檢索。也就是說,JSON解析可能比從Redis中檢索每個字段更快。而且,即使不是,它可能更有效率。無論如何,性能的差異可能是最小的。

7

JSON over HASH的另一個優點是維護類型。 123.3成爲字符串"123.3",並且取決於庫Null/None可能會意外地被鑄造爲"null"

兩者都有點乏味,因爲這需要編寫一個轉換器來提取字符串並將它們轉換回其預期的類型。我已經開始傾向於將數據存儲爲JSON列表["my_type_version", 123.5, null , ... ],所以我沒有N * (sum(len(concat(JSON key names)))的開銷,在我的情況下,這佔用了Redis已用內存佔用空間的+ 60%。

4

記住:哈希不能存儲嵌套的對象,JSON可以做到。