Interpretación de Hash (ziplist) en Redis 6.0

Tabla de contenido

Descripción general de los tipos de datos hash 

lista zip (lista comprimida) 

introducción básica 

Explicación detallada de la estructura 

problema de actualización de cadena


Descripción general de los tipos de datos hash 

El tipo de datos hash en Redis utiliza dos formatos de codificación: ziplist (lista comprimida), hashtable (tabla hash). En el archivo de configuración redis.conf, existen los siguientes dos parámetros, lo que significa: cuando el número de nodos es inferior a 512 y la cadena Cuando la longitud es menor o igual a 64, se utilizará la codificación ziplist.

hash-max-ziplist-entries 512    
hash-max-ziplist-value 64  

lista zip (lista comprimida) 

introducción básica 

ziplist es una lista doblemente enlazada especialmente codificada y diseñada para ahorrar memoria . Almacena valores de cadenas y números enteros, donde los números enteros se codifican como números enteros reales en lugar de como una secuencia de caracteres. Permite operaciones push y pop en cualquier lado de la lista en tiempo O(1). Sin embargo, dado que cada operación requiere la reasignación de la memoria utilizada por ziplist , la complejidad real está relacionada con la cantidad de memoria utilizada por ziplist.

ziplist es una lista especial doblemente enlazada que, a diferencia de las listas enlazadas ordinarias que utilizan punteros frontal y posterior para asociarlas, se almacena en la memoria continua.

Explicación detallada de la estructura 

  •  zlbytes: entero sin signo de 32 bits, registra el espacio ocupado por toda la estructura ziplist. Por supuesto, esto también incluye al propio zlbytes. Esta estructura tiene una gran utilidad, es decir, cuando necesitas modificar la lista zip, puedes conocer su tamaño sin atravesarla.
  • zltail: entero sin signo de 32 bits, registra el desplazamiento de la última entrada en toda la lista zip. Por lo tanto, no es necesario atravesar una vez al realizar la operación POP en la cola.
  • zllen: entero sin signo de 16 bits, registra el número de entradas, por lo que solo puede representar 2^16. Sin embargo, Redis ha realizado un procesamiento especial: cuando el número de entidades excede 2^16, el valor se fija en 2^16 - 1. Entonces, en este momento, si desea saber el número de todas las entidades, debe recorrer toda la estructura.
  • entrada: La estructura que realmente almacena datos.
  • zlend: entero sin signo de 8 bits, fijo en 255 (0xFF). Es el identificador final de ziplist.

La entrada  contiene atributos como longitud_entrada_anterior, codificación y contenido.

El primer caso: estructura general <prevlen> <codificación> <datos de entrada>

  • prevlen: el tamaño de la entrada anterior;
  • codificación: diferentes valores en diferentes situaciones, utilizados para representar el tipo y la longitud de la entrada actual;
  • datos de entrada: realmente se utiliza para almacenar los datos representados por la entrada;

El segundo caso: la estructura de entrada en este momento: <prevlen> <codificación>

  • Cuando el tipo int se almacena en la entrada, la codificación y los datos de entrada se combinarán y representarán en codificación. En este momento, no hay ningún campo de datos de entrada;
  • En redis, al almacenar datos, primero intentará convertir una cadena en almacenamiento int para ahorrar espacio;

 codificación prevlen: cuando la longitud del elemento anterior es menor que 254 (255 se usa para zlend), la longitud de prevlen es 1 byte y el valor es la longitud de la entrada anterior. Si la longitud es mayor o igual a 254, prevlen está representado por 5 bytes, el primer byte se establece en 254 y los siguientes 4 bytes almacenan un entero little-endian sin signo, que indica la longitud de la entrada anterior;

codificación:

La longitud y el valor de la codificación dependen de si se guarda int o string y de la longitud de los datos;

Los primeros dos dígitos se usan para indicar el tipo, cuando es "11", significa que la entrada almacena un tipo int y los otros dos significan que la entrada almacena una cadena;

Al almacenar int:

  • | 11 000000| la codificación es de 3 bytes, los últimos 2 bytes representan un int16;
  • | 11 010000| la codificación es de 5 bytes, los últimos 4 bytes representan un int32;
  • | 11 100000| la codificación es de 9 bytes y los últimos 8 bytes representan un int64;
  • | 11 110000| la codificación es de 4 bytes y los últimos 3 bytes representan un entero con signo;
  • | 11 111110| la codificación es de 2 bytes y el último byte representa un tipo entero con signo;
  • | 11 11xxxx| La longitud de codificación es de solo 1 byte y xxxx representa un valor entero de 0 a 12;

Al almacenar una cadena:

  • | 00 pppppp|: En este momento, la longitud de codificación es 1 byte. Los últimos seis bits del byte representan la longitud de la cadena almacenada en la entrada. Debido a que son 6 bits, la longitud de la cadena almacenada en la entrada no puede exceder 63;
  • | 01 pppppp|qqqqqqqqq| En este momento, la longitud de codificación es de dos bytes, en este momento, los últimos 14 bits de codificación se utilizan para almacenar la longitud de la cadena, y la longitud no puede exceder 16383;
  • | 10 000000|qqqqqqqq|rrrrrrrr|ssssssss|ttttttt| En este momento, la longitud de la codificación es de 5 bytes y los siguientes 4 bytes se utilizan para representar la longitud de la cadena almacenada en la codificación. La longitud no puede exceder 2 ^ 32 - 1;
problema de actualización de cadena

El campo prevlen en la entrada representa la longitud de la entrada anterior. Hay dos valores, 1 byte o 5 bytes.
Cuando la longitud de la entrada antes de una entrada cambia, resultará en la necesidad de aumentar el tamaño del campo prevlen de la entrada para almacenar la entrada anterior., si hay varias entradas consecutivas con una capacidad cercana a 254, será necesario ampliar el tamaño anterior de varias entradas y se producirá la llamada actualización en cascada.
La esencia de esta actualización es un cambio en el tamaño anterior, que tiene dos situaciones:

  • Una es expandir (1byte -> 5bytes),
  • Uno se está reduciendo (5 bytes—>1 byte)

Supongo que te gusta

Origin blog.csdn.net/m0_62436868/article/details/132702104
Recomendado
Clasificación