2015-05-06 27 views
7

Yapmam gereken şey, bire bir eşleştirmeyi saklamak. Veri seti, aynı türden (10M +) çok sayıda anahtar-değer çiftinden oluşmaktadır. Örneğin, Java bu tür verileri depolamak için tek bir HashMap nesnesini kullanabilir.Redis - büyük haritayı saklamak için en iyi yol (sözlük)

Bunu yapmanın ilk yolu bu gibi anahtar-değer çiftlerinin birçok saklamaktır:

HSET map key1 value 
... 
HSET map key900000 value900000 
HGET map key1 

REDIS: İkinci seçenek tek bir "karma" kullanmaktır

SET map:key1 value1 
... 
SET map:key900000 value900000 
GET map:key1 

Hashes'in bazı uygun komutları vardır ( HMSET, HMGET, HGETALL, vb.) Ve anahtar alanını kirletmezler, bu daha iyi bir seçenek gibi görünür. Bununla birlikte, bu yaklaşımı kullanırken herhangi bir performans veya hafıza konusu var mı?

+2

Bu aslında REDIS bazı RAM kurtarmak için bir önerilen kullanım kalıptır - http://redis.io/topics/memory-optimization#using-hashes-to-abstract-a-very-memory -üzerinde-düz-anahtar-değer-store-on-top-of-redis –

cevap

9

Evet, Itamar Haber olarak redis memory optimization guide'a bakmanız gerektiğini söylüyor. Ama aynı zamanda aklınızda bulundurun (birkaç satırda):

  1. KEYS'in yanı sıra HSET'i tercih edin. Redis sadece anahtar alan yönetiminde çok fazla bellek tüketir. 1.000.000 tuşlu basit (ve kaba) 1 HSET'de, 10x daha az bellek, ardından tek bir değere sahip 1.000.000 anahtar tüketir.
  2. Bellek ana hedefse, HSET boyutunu hash-max-zipmap-entries'dan daha az ve geçerli hash-max-zipmap-value yürürlükte tutun. Anladığınızdan emin olun, ne hash-max-zipmap-entries ve hash-max-zipmap-value anlamına gelir. Ayrıca ziplist hakkında okumak için biraz zaman ayırın.
  3. hash-max-zipmap-entries'u 10M + tuşları ile işlemek için mantıklı olmamanız (bu tuşlara erişimi yavaşlatmak için), bazı yuvalarda bir HSET kırmanız gerekir. Örneğin, hash-max-zipmap-entries'u 10.000 olarak ayarladınız. Yani 10M + tuşlarını saklamak için 10,000 ile 1000+ HSET anahtarına ihtiyacın var. Kaba örnek için - crc32 (anahtar)% maxHsets.
  4. strings in redis hakkında bilgi edinin ve bu yapı için gerçek bellek yönetimine dayalı KEY adlarını (HSET cinsinden) kullanın. Basit - beklemede anahtar uzunluğunu 7 bayt altında tutuyorsanız, anahtar başına 16 bayt harcıyorsunuz, ancak 8 baytlık anahtar her biri 48 bayt harcıyor. Niye ya? simple dynamic strings hakkında okuyun.

yaklaşık okumak için yararlı olabilir:

+0

Büyük cevap, aferin. –

+0

Bu bilgiyi takdir ediyorum. – NappingRabbit

+0

Toplam veritabanı belleği ayak izinin, şeyleri saklamanın farklı yollarıyla karşılaştırıldığı https://www.peterbe.com/plog/understanding-redis-hash-max-ziplist-entries'teki grafikleri inceleyin. –

İlgili konular