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 -
- 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.
- Liczba całkowita większa niż 10000 i mieści się w zakresie o długim zużyciu 8 bajtów.
- 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ęć.
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
@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. –
@ 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! –