Red de conocimiento informático - Problemas con los teléfonos móviles - Uso de memoria de cada tipo de datos en Redis

Uso de memoria de cada tipo de datos en Redis

Primero, proporcionemos una URL para analizar el uso de la memoria de Redis: /redis_memory/

Esta herramienta puede proporcionarnos un análisis del uso de la memoria. La siguiente figura es un ejemplo:

Cuándo. Cuando usamos Redis, el tipo de cadena es el tipo más utilizado y el único tipo que no es de colección.

Sin embargo, el tipo String no es adecuado para todas las situaciones y tiene la desventaja obvia de que consume más espacio de memoria al guardar datos.

La razón por la que el tipo String ocupa más espacio es que, además de registrar los datos reales, el tipo String también requiere espacio de memoria adicional para registrar la longitud de los datos, el uso del espacio y otra información. La información también se llama metadatos. Esta información también se llama metadatos. Cuando los datos reales guardados son pequeños, la sobrecarga de espacio de los metadatos será grande.

Cuando guarda un entero de 64 bits con signo, el tipo cadena lo guarda como un entero de 8 bytes de tipo Long, que a menudo se denomina codificación int. Sin embargo, cuando guarda datos que contienen caracteres, el tipo Cadena los guarda como una estructura de cadena dinámica simple (SDS).

La memoria ocupada por el almacenamiento SDS es la siguiente:

En SDS, buf guarda los datos reales, mientras que len y alloc son en realidad una sobrecarga adicional de la estructura SDS.

Sin embargo, además de la sobrecarga adicional de SDS, el tipo de cadena también contiene la sobrecarga de una estructura RedisObject (que contiene 8 bytes de metadatos y 8 bytes de punteros), como se muestra a continuación:

Para evitar que el tipo de cadena anterior ocupe demasiada memoria, podemos usar tablas comprimidas para el almacenamiento.

Las tablas comprimidas ahorran memoria porque almacenan datos en una serie de entradas contiguas.

Redis implementa tipos de colección como Lista, Hash y Conjunto ordenado basados ​​en listas comprimidas. El mayor beneficio de esto es que ahorra la sobrecarga de dictEntry. Cuando se utiliza el tipo de cadena, cada par clave-valor tiene un dictEntry, que ocupa 32 bytes de espacio. Pero cuando usa el tipo de colección, una clave corresponde a una colección de datos, lo que guardará más datos y también usará solo un dictEntry, ahorrando así memoria.

El tipo hash establece dos umbrales para guardar datos en una lista comprimida. Una vez que se excede el umbral, el tipo hash guarda los datos en una tabla hash. Estos dos umbrales corresponden a los siguientes dos elementos de configuración:

hash-max-ziplist-entries: indica el número máximo de elementos en el conjunto hash al guardar usando una lista comprimida.

hash-max-ziplist-value: Indica la longitud máxima de un solo elemento en el conjunto hash cuando se guarda en una lista comprimida.