Internamente, Redis memorizza le stringhe nel modo più efficiente. Forzare numeri interi in stringhe radix 10 utilizzerà effettivamente più memoria.
Ecco come Redis memorizza le stringhe -
- Interi inferiori a 10000 sono archiviati in un pool di memoria condiviso e non hanno alcun sovraccarico di memoria. Se lo desideri, puoi aumentare questo limite modificando la costante REDIS_SHARED_INTEGERS in redis.h e ricompilando Redis.
- Interi maggiori di 10000 e nell'intervallo di un long consumano 8 byte.
- Le stringhe normali richiedono len(string) + 4 byte per la lunghezza + 4 byte per contrassegnare lo spazio libero + 1 byte per il terminatore null + 8 byte per i costi generali di malloc.
Nell'esempio che hai citato, è una domanda di 8 byte per un lungo v/s 21 byte per la stringa.
MODIFICA :
Quindi, se ho una serie di numeri tutti inferiori a 10.000, come fa Redis a memorizzare la mia serie?
Dipende da quanti elementi hai.
Se hai meno di 512 elementi nel tuo set (vedi set-max-intset-entries
), il set verrà archiviato come IntSet. Un IntSet è un nome glorificato per un array di interi ordinati. Poiché i tuoi numeri sono inferiori a 10000, utilizzerebbe 16 bit per elemento. È (quasi) efficiente in termini di memoria come un array C.
Se hai più di 512 elementi, il set diventa una HashTable. Ogni elemento del set è racchiuso in una struttura chiamata robj
, che ha un sovraccarico di 16 byte. Il robj
struttura ha un puntatore al pool condiviso di interi, quindi non si paga nulla in più per l'intero stesso. E infine, il robj
le istanze sono archiviate nella tabella hash e la tabella hash ha un sovraccarico proporzionale alla dimensione del set.
Se sei interessato a quanta memoria esattamente consuma un elemento, esegui redis-rdb-tools sul tuo set di dati (disclaimer:sono l'autore di questo strumento). Oppure puoi leggere il codice sorgente per la classe MemoryCallback, i commenti spiegano come è strutturata la memoria.