Internamente, o Redis armazena strings da maneira mais eficiente. Forçar inteiros em strings de raiz 10 usará mais memória.
Veja como o Redis armazena Strings -
- Inteiros menores que 10.000 são armazenados em um pool de memória compartilhada e não têm sobrecarga de memória. Se desejar, você pode aumentar esse limite alterando a constante REDIS_SHARED_INTEGERS em redis.he recompilando o Redis.
- Inteiros maiores que 10.000 e dentro do alcance de um longo consomem 8 bytes.
- Strings regulares levam len(string) + 4 bytes para comprimento + 4 bytes para marcação de espaço livre + 1 byte para terminador nulo + 8 bytes para overheads malloc.
No exemplo que você citou, é uma questão de 8 bytes para um longo v/s 21 bytes para a string.
EDITAR:
Então, se eu tiver um conjunto de números menor que 10.000, como o Redis armazena meu conjunto?
Depende de quantos elementos você tem.
Se você tiver menos de 512 elementos em seu conjunto (consulte
set-max-intset-entries
), então o conjunto será armazenado como um IntSet. Um IntSet é um nome glorificado para um Sorted Integer Array. Como seus números são menores que 10.000, usaria 16 bits por elemento. É (quase) tão eficiente em termos de memória quanto um array C. Se você tiver mais de 512 elementos, o conjunto se tornará uma HashTable. Cada elemento do conjunto é envolto em uma estrutura chamada
robj
, que tem uma sobrecarga de 16 bytes. O robj
estrutura tem um ponteiro para o conjunto compartilhado de inteiros, então você não paga nada extra pelo próprio inteiro. E, finalmente, o robj
instâncias são armazenadas na tabela de hash, e a tabela de hash tem uma sobrecarga proporcional ao tamanho do conjunto. Se você estiver interessado em exatamente quanta memória um elemento consome, execute redis-rdb-tools em seu conjunto de dados (disclaimer:eu sou o autor desta ferramenta). Ou você pode ler o código-fonte da classe MemoryCallback, os comentários explicam como a memória é disposta.