SORU
4 Mayıs 2013, CUMARTESİ


Dizeleri vs Redis Redis karma JSON temsil: verimlilik?

Redis içine bir JSON yükü depolamak istiyor. Gerçekten bunu yapabilirim 2 yolu var:

  1. Basit bir dize anahtarları ve değerleri kullanarak.
    anahtar:kullanıcı, değeri:yükü (100-200 KB olan tüm JSON blob)

    SET user:1 payload

  2. Sağlamalarının kullanarak

    HSET user:1 username "someone"
    HSET user:1 location "NY"
    HSET user:1 bio "STRING WITH OVER 100 lines"

Eğer bir karma kullanırsam, değer uzunluğu öngörülebilir değildir unutmayın. Biyo yukarıdaki örnekte olduğu gibi kısa değiller.

Daha hızlı olan? Dize anahtarları ve değerleri kullanarak, ya da bir hash kullanarak?

CEVAP
24 EYLÜL 2013, Salı


Bu makale fikir alınabilir: http://redis.io/topics/memory-optimization

Redis Nesneleri bir dizi depolamak için birçok yolu vardırspoiler: Çoğu zaman kullanmak için Seçenek 1 İ gibi:

  1. Tek bir anahtarı JSON kodlanmış bir dize olarak tüm nesne deposu ve tüm Nesneleri bir dizi (veya liste, daha uygun olursa) kullanarak takip edin. Örneğin:

    INCR id:users
    SET user:{id} '{"name":"Fred","age":25}'
    SADD users {id}
    

    Genel olarak konuşursak, bu muhtemelen çoğu durumda en iyi yöntem. Eğer orada bir çok alanda Nesne, Nesneler değil, iç içe geçmiş olan diğer Nesneler, ve eğilimi için sadece erişim küçük bir alt alanlarında bir zaman olabilir gitmek daha iyi olan seçenek 2.

    Avantajları: "iyi bir uygulama." olarak kabul Her Nesne tam gelişmiş Redis bir anahtardır. JSON ayrıştırma özellikle bu Nesne için birçok alanda aynı anda erişmek istediğinizde hızlı.Dezavantajlarısadece tek bir alana erişmek için gereken zaman daha yavaş.

  2. Redis karma her Nesnenin özelliklerini saklar.

    INCR id:users
    HMSET user:{id} name "Fred" age 25
    SADD users {id}
    

    Avantajları: "iyi bir uygulama." olarak kabul Her Nesne tam gelişmiş Redis bir anahtardır. Hayır JSON dizesini ayrıştırmak gerekiyor.Dezavantajları: Nesne alanları çoğu/tüm erişmek için gereken zaman büyük olasılıkla daha yavaş. Ayrıca, iç içe geçmiş Nesneleri (Nesne içindeki Nesneleri) kolayca depolanamaz.

  3. Mağaza Redis bir karma JSON dize olarak her Nesne.

    INCR id:users
    HMSET users {id} '{"name":"Fred","age":25}'
    

    Bu biraz pekiştirmek ve tek tuşları çok yerine iki anahtar kullanmak için izin verir. Bariz dezavantajı sadece Redis karma bir alan ve tam anlamıyla Redis bir anahtar olduğundan her kullanıcı Nesne üzerinde TTL (ve diğer şeyler) ayarlayabilirsiniz.

    Avantajları: JSON ayrıştırma özellikle bu Nesne için birçok alanda aynı anda erişmek istediğinizde hızlı. Daha az "kirleten" ana anahtar ad.Dezavantajları: Nesneler çok olduğunda #1 Aynı bellek kullanımı hakkında. Sadece tek bir alana erişmek için gereken zaman #2'den daha yavaş. Muhtemelen kabul edilmez bir "iyi uygulama."

  4. Özel bir anahtar, her bir Nesnenin her özelliği saklayın.

    INCR id:users
    SET user:{id}:name "Fred"
    SET user:{id}:age 25
    SADD users {id}
    

    Yukarıdaki maddeye göre, bu seçenekhemen hemen hiçtercih edilen Nesnenin özelliği TTL ya da özel bir şey olması gerekiyor sürece).

    Avantajları: Nesne özellikleri tam gelişmiş uygulama için overkill olmayabilir Redis anahtarları vardır.Dezavantajları: yavaş, daha fazla bellek kullanır ve "en iyi uygulama." olarak Ana anahtar ad kirletici bir sürü.

Genel Özet

Seçenek 4 genellikle tercih edilmiyor. Seçenek 1 ve 2 çok benzer, ve her ikisi de oldukça yaygın. Sen daha karmaşık Nesneleri (iç içe geçmiş çok katmanlı, vb.) depolamak için izin verir, çünkü seçenek 1 (genel anlamda) tercih ederim Seçenek 3 olarak kullanılırgerçekten bakımhakkında ana anahtar ad kirletici (mesela veritabanınızda çok anahtarı olmak istemediğin şeyler TTL, anahtar sharding gibi, ya da her neyse umurumda değil).

Eğer yanlış bir şey var ise, lütfen yorum bırakarak bana downvoting önce cevap gözden geçirmek için izin düşünün. Teşekkürler! :)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • calicoJake

    calicoJake

    29 EKİM 2007
  • ChrisCrossMedia

    ChrisCrossMe

    17 EYLÜL 2009
  • EminemVEVO

    EminemVEVO

    12 Mayıs 2009