Interně Redis ukládá řetězce tím nejefektivnějším způsobem. Vynucení celých čísel do řetězců radix 10 ve skutečnosti spotřebuje více paměti.
Zde je návod, jak Redis ukládá řetězce -
- Celá čísla menší než 10 000 jsou uložena ve společné oblasti paměti a nevyžadují žádnou režii paměti. Pokud chcete, můžete tento limit zvýšit změnou konstanty REDIS_SHARED_INTEGERS v redis.h a rekompilací Redis.
- Celá čísla větší než 10 000 a v rozsahu long spotřebují 8 bajtů.
- Běžné řetězce zabírají len(řetězec) + 4 bajty pro délku + 4 bajty pro označení volného místa + 1 bajt pro null terminátor + 8 bajtů pro režii malloc.
V příkladu, který jste citovali, je to otázka 8 bajtů pro dlouhý v/s 21 bajtů pro řetězec.
EDIT:
Takže pokud mám sadu čísel všech méně než 10 000, jak Redis uloží moji sadu?
Záleží na tom, kolik prvků máte.
Pokud máte v sadě méně než 512 prvků (viz set-max-intset-entries
), pak bude sada uložena jako IntSet. IntSet je počeštěný název pro pole Sorted Integer Array. Protože vaše čísla jsou menší než 10 000, použije se 16 bitů na prvek. Je (téměř) stejně paměťově efektivní jako pole C.
Pokud máte více než 512 prvků, ze sady se stane HashTable. Každý prvek v sadě je zabalen do struktury nazvané robj
, který má režii 16 bajtů. robj
struktura má ukazatel na sdílený fond celých čísel, takže za samotné celé číslo neplatíte nic navíc. A nakonec robj
instance jsou uloženy v hashtable a hashtable má režii, která je úměrná velikosti sady.
Pokud vás zajímá přesně, kolik paměti spotřebovává prvek, spusťte na své datové sadě nástroje redis-rdb-tools (odmítnutí odpovědnosti:Jsem autorem tohoto nástroje). Nebo si můžete přečíst zdrojový kód pro třídu MemoryCallback, komentáře vysvětlují, jak je paměť uspořádána.