sql >> Base de Datos >  >> NoSQL >> Redis

Forma eficiente de memoria para almacenar enteros con signo de 32 bits en Redis

Internamente, Redis almacena cadenas de la manera más eficiente. Forzar números enteros en cadenas radix 10 en realidad usará más memoria.

Así es como Redis almacena cadenas:

  1. Los números enteros inferiores a 10000 se almacenan en un grupo de memoria compartida y no tienen sobrecarga de memoria. Si lo desea, puede aumentar este límite cambiando la constante REDIS_SHARED_INTEGERS en redis.h y recompilando Redis.
  2. Enteros superiores a 10000 y dentro del rango de un largo consumen 8 bytes.
  3. Las cadenas regulares toman len(cadena) + 4 bytes para la longitud + 4 bytes para marcar el espacio libre + 1 byte para el terminador nulo + 8 bytes para los gastos generales de malloc.

En el ejemplo que citó, es una cuestión de 8 bytes para un largo v/s 21 bytes para la cadena.

EDITAR:

Entonces, si tengo un conjunto de números todos menos de 10,000, ¿cómo almacena Redis mi conjunto?

Depende de cuántos elementos tengas.

Si tiene menos de 512 elementos en su conjunto (consulte set-max-intset-entries ), el conjunto se almacenará como un IntSet. Un IntSet es un nombre glorificado para una matriz de enteros ordenados. Dado que sus números son inferiores a 10000, usaría 16 bits por elemento. Es (casi) tan eficiente en memoria como una matriz C.

Si tiene más de 512 elementos, el conjunto se convierte en HashTable. Cada elemento del conjunto está envuelto en una estructura llamada robj , que tiene una sobrecarga de 16 bytes. El robj La estructura tiene un puntero al conjunto compartido de enteros, por lo que no paga nada adicional por el entero en sí. Y finalmente, el robj las instancias se almacenan en la tabla hash, y la tabla hash tiene una sobrecarga que es proporcional al tamaño del conjunto.

Si está interesado en saber exactamente cuánta memoria consume un elemento, ejecute redis-rdb-tools en su conjunto de datos (descargo de responsabilidad:soy el autor de esta herramienta). O puede leer el código fuente de la clase MemoryCallback, los comentarios explican cómo se distribuye la memoria.