2011-04-20 10 views
22

bir dize olarak mağaza json nesnesi, bir şey gibi:Redis performans, bir kullanıcı modeli kaydetmeniz gerekir

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

Bugün, bir Set kullanın: Kullanıcıların
Bu Set, ben kullanıcı gibi bir üyeye sahip : bizi kullanmak Hala

: alan
Bu üye ben

yukarıdaki karma Bu iyi çalışıyor ancak bunun yerine anlamda aşağıdaki birini kullanmak yapabilir yukarıdaki yaklaşımın diye merak edildi sahip ers Seti Bu set
sadece böyle bir anahtar/değer depolama birimini kullanır (kolayca kullanıcılar (üyeler) liste almak için):

tuşu: alan değeri: Yukarıdaki kullanıcı karma stringify versiyonunu

Alma Daha sonra bir kayıt daha kolay olurdu (Daha sonra JSON ile ayrıştırmak zorunda kalacağım).

Redis için çok yeniyim ve en iyi ne olabileceğinden emin değilim. Ne düşünüyorsun ?

cevap

20

JSON nesne alanlarınızı ve değerlerinizi saklamak için Redis hashes veri yapısını kullanabilirsiniz.

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

Artık tüm kullanıcıların veya sadece belirli bir anahtar tarafından alabilirsiniz: Örneğin sizin "kullanıcılar" seti hala tüm kullanıcıların depolayan ve bireysel JSON nesnesi böyle karma içine saklanabilir bir liste olarak kullanılabilir (hangisi sadece belirtilen alanları/değerleri alır/ayarlar). Ayrıca, thesetwo soruları da muhtemelen senaryonuzla ilgilidir.

DÜZENLEME: o zaman (o zaman JSON ile Ayrıştırma zorunda kalacak) kolay olacağını rekor alınıyor

(üzgünüm ben bu daha önce bahsettiğimiz fark etmedi).

Bu doğrudur, ancak karma veri yapısıyla birlikte çalışmanız gereken alanı/değeri alabilir/ayarlayabilirsiniz. Tüm JSON nesnesini geri almak, yalnızca nesnenin bir kısmını değiştirmek istiyorsanız (başka bir şey, nesneyi her seferinde nesnelleştirmeniz/ayırmanız gerekmesidir) performansın azalmasına neden olabilir (ne sıklıkta yaptığınıza bağlıdır).

+0

evet, haklısınız. Ne demek istediğini anladım. Teşekkürler – Luc

2

Her iki durumda da her şey yolunda gidiyor. Sakladığınız yol, yapmanız gereken bir tasarım kararıdır. Bu, kullanıcı bilgilerini nasıl almak istediğinize bağlıdır.

Performans açısından, kullanıcı nesnesinin JSON kodlu sürümünün depolanması daha az bellek kullanır ve depolama/alma için daha az zaman harcar. Yani JSON ayrıştırma muhtemelen her alandan Redis'ten daha hızlıdır. Ve olmasa bile, muhtemelen daha fazla bellek verimli. Performanstaki fark muhtemelen her zaman azdır.

7

JSON over karmaşıkları için bir ek özellik, bakım türüdür. 123.3, "123.3" dizesi olur ve Null/None kitaplığına bağlı olarak, yanlışlıkla "null"'a dökülebilir.

Her ikisi de biraz sıkıcı çünkü dizeleri ayıklamak ve bunları beklenen türlerine dönüştürmek için bir transformatör yazmak gerekir. uzay/bellek tüketimi hususlar için

, ben bu yüzden benim durumumda REDIS en kullanılan bellek ayak izi +% 60 idi N * (sum(len(concat(JSON key names))) yükünü yoktu JSON listesinde ["my_type_version", 123.5, null , ... ] olarak sadece değerlerini saklamak doğru eğilerek başladık.

4

unutmayın: Hashes iç içe nesneleri depolayamaz, JSON yapabilir.