2013-04-22 12 views
8

Ponieważ Redis próbuje sparsować ciągi do 64-bitowych liczb całkowitych ze znakiem, czy dobrze jest zapisać binarną reprezentację 32-bitowej liczby całkowitej ze znakiem zamiast 10-cyfrowej liczby radix?Pamięciowy sposób przechowywania 32-bitowej liczby całkowitej ze znakiem w Redis

W naszym systemie mamy listy wielu 32-bitowych liczb całkowitych ze znakiem.

I can store them like 
lpush mykey 102450 --> redis cast 102450 to 8 bytes long 

or store it like 
lpush mykey \x00\x01\x19\x32 ---> this is just 4 bytes 

Odpowiedz

17

Wewnętrznie, Redis przechowuje łańcuchy w najbardziej efektywny sposób. Wymuszenie liczb całkowitych na łańcuchach radix 10 spowoduje wykorzystanie większej ilości pamięci.

Oto jak Redis sklepy Strings -

  1. Liczby poniżej 10000 są przechowywane we wspólnej puli pamięci, i nie mają żadnych kosztów ogólnych pamięci. Jeśli chcesz, możesz zwiększyć ten limit, zmieniając stałą REDIS_SHARED_INTEGERS in redis.h i rekompilując Redis.
  2. Liczba całkowita większa niż 10000 i mieści się w zakresie o długim zużyciu 8 bajtów.
  3. Zwykłe łańcuchy przyjmują len (ciąg) + 4 bajty dla długości + 4 bajty dla oznaczenia wolnego miejsca + 1 bajtu dla terminatora o wartości zerowej + 8 bajtów dla średnich kosztów malloc.

W cytowanym przykładzie jest to 8 bajtów dla długich v/s 21 bajtów dla ciągu znaków.

EDIT:

Więc jeśli mam zestaw liczb niecałe 10000 jaki sposób Redis przechowywania mój zestaw?

To zależy od liczby posiadanych elementów.

Jeśli w zestawie jest mniej niż 512 elementów (patrz set-max-intset-entries), zestaw zostanie zapisany jako IntSet. IntSet to gloryfikowana nazwa Sorted Integer Array. Ponieważ twoje liczby są mniejsze niż 10000, użyjesz 16 bitów na element. Jest (prawie) tak wydajna pod względem pamięci jak tablica C.

Jeśli masz więcej niż 512 elementów, zestaw staje się HashTable. Każdy element zestawu jest zawinięty w strukturę o nazwie robj, która ma narzut 16 bajtów. Struktura robj ma wskaźnik do współużytkowanej puli liczb całkowitych, więc nie płacisz nic więcej za samą liczbę całkowitą. I wreszcie, instancje robj są przechowywane w tablicy hashtable, a tablica hashtable ma narzut, który jest proporcjonalny do rozmiaru zestawu.

Jeśli interesuje Cię dokładnie ilość zużywanego przez Ciebie elementu, uruchom redis-rdb-tools na swoim zestawie danych. Lub możesz odczytać kod źródłowy dla klasy MemoryCallback, komentarze wyjaśnić, jak układa się pamięć.

+0

Dziękuję za odpowiedź. Czy mógłbyś wyjaśnić nieco więcej na temat wspólnej puli pamięci. Więc jeśli mam zestaw liczb mniejszy niż 10.000, w jaki sposób Redis przechowuje mój zestaw? – Aresn

+0

@Aresn - Zobacz aktualizacje mojej odpowiedzi. Jeśli przechowujesz zestawy liczb całkowitych mniejszych niż 10000, Redis będzie bardzo wydajny pod względem pamięci. –

+0

@ sripathi-krishnan nie mógłbyś określić, ile bajtów jest używanych do przechowywania kluczy łańcuchowych? Czy "len() + 4 + 4 + 1 + 8 bajt" stosuje się tylko do wartości? Musimy przechowywać naprawdę duży zestaw danych par string (43) => int i potrzebujemy ocenić wolumin. Dzięki dla informacji! –

1

Struny przechowywane są o długości, więc to nie będzie tylko 4 bajty w bazie danych - to prawdopodobnie przechowywane jako dane 4 bajty + 4 bajty długości + obicia, więc nie zyskać nic.

Powiązane problemy