2015-05-06 13 views
7

Co muszę zrobić, to zapisać mapowanie jeden-do-jednego. Zbiór danych składa się z dużej liczby par klucz-wartość tego samego rodzaju (10 mln +). Na przykład można użyć pojedynczej instancji obiektu HashMap w Javie do przechowywania takich danych.Redis - najlepszy sposób na zapisanie dużej mapy (słownika)

Pierwszy sposób to zrobić, aby przechowywać wiele par klucz-wartość, na przykład:

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

Drugą opcją jest użycie jednego "hash":

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

Redis Hasch ma kilka wygodnych poleceń (HMSET, HMGET, HGETALL itd.) I nie zanieczyszczają one przestrzeni kluczy, więc wygląda to na lepszą opcję. Czy są jednak jakieś rozważania dotyczące wydajności lub pamięci podczas korzystania z tego podejścia?

+2

Właściwie jest to zalecane użycie wzorca, aby zaoszczędzić trochę pamięci RAM z Redis - http://redis.io/topics/memory-optimization#using-hashes-to-abstract-a-very-memory Efektywny-czysty-klucz-wartość-sklep-na-od-redis –

Odpowiedz

9

Tak, jako Itamar Haber mówi się, że powinieneś spojrzeć na redis memory optimization guide. Ale należy również pamiętać o takich rzeczach (w kilku liniach):

  1. Preferuj HSET oprócz klawiszy. Redis zużywa dużo pamięci tylko na kluczowej przestrzeni kosmicznej. W prosty (i szorstki) 1 HSET z 1 000 000 kluczy zużywa do 10 razy mniej pamięci niż 1 000 000 kluczy z jedną wartością.
  2. Zachowaj wartość HSET mniejszą niż hash-max-zipmap-entries i ważnij hash-max-zipmap-value, jeśli pamięć jest głównym celem. Pamiętaj, aby zrozumieć, co oznacza hash-max-zipmap-entries i hash-max-zipmap-value. Poświęć trochę czasu na przeczytanie o zipliście.
  3. Chociaż nie radzisz sobie z hash-max-zipmap-entries za pomocą klawiszy 10M + (w celu powolnego dostępu do tych klawiszy), powinieneś złamać jeden HSET w niektórych gniazdach. Na przykład ustawiłeś hash-max-zipmap-entries jako 10 000. Tak więc, aby przechowywać klucze 10M +, potrzebujesz ponad 1000 kluczy HSET z 10 000 kluczy. Dla przykładu - crc32 (klucz)% maxHsets.
  4. Przeczytaj o strings in redis i użyj nazw KLUCZY (w HSET) na podstawie rzeczywistego zarządzania pamięcią dla tej struktury. W prosty sposób - zachowując długość klucza poniżej 7 bajtów, wydajesz 16 bajtów na klucz, ale klucz 8-bajtowy wydaje po 48 bajtów. Czemu? Przeczytaj o simple dynamic strings.

Może to być przydatne, by przeczytać o:

+0

Świetna odpowiedź, dobra robota. –

+0

Doceniam tę informację. – NappingRabbit

+0

Zobacz wykresy na stronie https://www.peterbe.com/plog/understanding-redis-hash-max-ziplist-entries, gdzie całkowity rozmiar pamięci bazy danych jest porównywany z różnymi sposobami przechowywania rzeczy. –