Tipo de datos y codificación de Redis

Tipo de datos y codificación de Redis

Hablando de los tipos de datos de Redis, probablemente pensaremos rápidamente en los cinco tipos de datos comunes de Redis: cadena (Cadena), lista (Lista), hash (Hash), conjunto (Conjunto), conjunto ordenado (Conjunto ordenado) ), así como sus características, escenarios de aplicación y comandos comunes. Pero antes de hablar sobre los cinco tipos de datos, debemos mirar los comandos de operación global en redis. A continuación se muestran algunas operaciones comunes y su complejidad de tiempo y escenarios de uso.

Inserte la descripción de la imagen aquí

La mayoría de los comandos globales son para la configuración y modificación de atributos clave. Además de las operaciones globales, los cinco tipos de datos de redis que se usan comúnmente también tienen sus propios comandos de operación separados. Echemos un vistazo a ellos uno por uno. Por cierto, echemos un vistazo a estos tipos de datos. Los principios internos también se entienden a grandes rasgos.

Inserte la descripción de la imagen aquí

Para hablar sobre los principios internos, primero tenemos que ver cuántos métodos de codificación hay en redis:

/* Objects encoding. Some kind of objects like Strings and Hashes can be
 * internally represented in multiple ways. The 'encoding' field of the object
 * is set to one of this fields for this object. */
#define OBJ_ENCODING_RAW 0     /* Raw representation */
#define OBJ_ENCODING_INT 1     /* Encoded as integer */
#define OBJ_ENCODING_HT 2      /* Encoded as hashtable */
#define OBJ_ENCODING_ZIPMAP 3  /* Encoded as zipmap */ // 已废弃
#define OBJ_ENCODING_LINKEDLIST 4 /* Encoded as regular linked list */
#define OBJ_ENCODING_ZIPLIST 5 /* Encoded as ziplist */
#define OBJ_ENCODING_INTSET 6  /* Encoded as intset */
#define OBJ_ENCODING_SKIPLIST 7  /* Encoded as skiplist */
#define OBJ_ENCODING_EMBSTR 8  /* Embedded sds string encoding */
#define OBJ_ENCODING_QUICKLIST 9 /* Encoded as linked list of ziplists */

No importa si no comprende estos métodos de codificación, ya que hablaremos de ellos más adelante. A continuación, partimos de los cinco tipos de datos y los explicamos sucesivamente.

(1) Cadena

La cadena es el tipo de datos más básico de redis y una clave corresponde a un valor. El tipo de cadena es binario seguro, lo que significa que la cadena redis puede contener cualquier dato, como imágenes u objetos serializados. El tipo de cadena es el tipo de datos más básico de redis, y una clave puede almacenar hasta 512 MB de datos. La estructura de datos String es un tipo de clave-valor simple.

Hay tres métodos de codificación para el tipo de cadena, a saber, int, raw, embstr.

1.int codificación

El valor guardado por el objeto de cadena es un valor entero, y el valor entero está dentro del rango de long, luego redis usa el valor entero para guardar esta información y la codificación de cadena se establece en int.

2.codificación sin formato

El objeto de cadena guarda una cadena, la longitud es superior a 32 bytes, la estructura de datos SDS (cadena dinámica simple) se utilizará para guardar el valor de la cadena y la codificación del objeto de cadena se establece en bruto.

3. codificación embstr

El objeto de cadena guarda una cadena con una longitud de menos de 32 bytes. Se guardará usando embstr. La codificación embstr es una optimización de SDS y se guarda en un espacio continuo, es decir, se colocan el valor de la SDS y el valor del objeto de cadena En un espacio de memoria contiguo. Se utiliza principalmente para mejorar la eficiencia cuando se utilizan objetos de cuerda más pequeños. Además, la codificación embstr es de solo lectura, siempre que se produzca una operación de modificación, la codificación se convertirá a raw y luego se operará.

PD: Si la cadena se almacena como un número de punto flotante, el número de punto flotante se convertirá primero en una cadena y luego se seleccionará el método de codificación de acuerdo con las tres condiciones anteriores. Cuando se opera el número de punto flotante, debe convertirse de una cadena a un número de punto flotante para el cálculo y luego convertirse en una cadena para su almacenamiento.

Inserte la descripción de la imagen aquí

(2) Hachís

El tipo de hash es muy similar a la tabla de datos de una base de datos relacional. La clave del hash es un valor único y la parte de valor es una estructura de mapa de hash. El tipo de datos hash tiene la ventaja de ser más flexible y más rápido que el tipo de cadena al almacenar objetos. Específicamente, el uso del almacenamiento de tipo de cadena debe inevitablemente requerir la conversión y el análisis de cadenas de formato json. Incluso si no se requiere conversión, la sobrecarga de memoria sigue siendo El hash es más dominante. El modelo hash es básicamente así:

Inserte la descripción de la imagen aquí
La codificación de objetos hash incluye ziplist y hashtable.

Codificación 1.ziplist

Cuando la longitud de la clave y el valor del par clave-valor es inferior a 64 bytes y el número de pares clave-valor es inferior a 512, utilice la codificación ziplist, la estructura de datos subyacente utiliza ziplist y se utilizarán dos nodos ziplist consecutivos para representar uno de los objetos hash Pares clave-valor.

2.codificación hash

Cuando la longitud de la clave o el valor del par clave-valor es superior a 64 bytes, o el número de pares clave-valor es superior a 512, se usa la codificación de tabla hash y la estructura de datos subyacente usa tabla hash. Hash es muy similar en estructura a la tabla hash, por lo que cada par clave-valor en el objeto hash es un par clave-valor en la tabla hash.

Inserte la descripción de la imagen aquí

(Tres) Lista

La lista en redis es una lista simple de cadenas, ordenadas en el orden de inserción. Puede agregar un elemento al principio (izquierda) o al final (derecha) de la lista, como una cola doble.

Inserte la descripción de la imagen aquí

El tipo de lista se utiliza a menudo en el servicio de colas de mensajes para completar el intercambio de mensajes entre múltiples programas. En la versión anterior (parece estar por debajo de 3.2), la lista utiliza un total de dos estructuras de datos: lista enlazada comprimida y lista doblemente enlazada. Cuando el número de elementos es pequeño, use una lista comprimida, cuando el número de elementos aumente, use una lista doblemente enlazada.

Pero después de 3.2, apareció una nueva estructura de datos-lista rápida (lista rápida), esta estructura de datos ahora se ha convertido en la implementación subyacente de todas las listas.

Inserte la descripción de la imagen aquí

(4) Colección de conjuntos

Un conjunto es una colección y el concepto de colección es una combinación de valores únicos. Usando el tipo de datos establecido proporcionado por redis, se pueden almacenar algunos datos colectivos. El conjunto de redis es una colección desordenada de tipo cadena. La mayor ventaja de los conjuntos es que pueden realizar operaciones de intersección, unión y resta. El número máximo de elementos que puede contener un conjunto es 4294967295.

Inserte la descripción de la imagen aquí
La codificación de los objetos de colección incluye intset y hashtable.

Codificación 1.intset

Cuando todos los elementos del conjunto son números enteros y el número no es superior a 512, utilice la codificación intset. La codificación intset subyacente usa la estructura de datos intset.

2.codificación hash

Cuando los elementos que no coinciden son todos valores enteros y el número de elementos es inferior a 512, el método de codificación utilizado por el objeto de colección es tabla hash. Cada clave de hashtable es un objeto de cadena, que almacena un elemento en la colección, y el valor de hashtable se establece en NULL.

Inserte la descripción de la imagen aquí

(5) Conjunto ordenado conjunto ordenado

En comparación con el conjunto, el conjunto ordenado agrega una puntuación de parámetro de peso a los elementos del conjunto, de modo que los elementos del conjunto se pueden organizar en orden de acuerdo con la puntuación. El conjunto ordenado también es una colección de elementos de tipo cadena como conjunto, y no se permiten miembros duplicados. La diferencia es que cada elemento está asociado con una puntuación de tipo doble. Redis utiliza puntuaciones para ordenar los miembros del conjunto de pequeños a grandes. Los miembros del conjunto son únicos, pero la puntuación (puntuación) se puede repetir. El conjunto ordenado se inserta ordenado, es decir, ordenado automáticamente.

Hay códigos ziplist y skiplist para objetos de colección ordenados.

Codificación 1.ziplist

Cuando la cantidad de elementos sea menor a 128 y la longitud de todos los miembros del elemento sea menor a 64 bytes, use la codificación ziplist. La estructura de datos del objeto de colección ordenado es ziplist. Para cada elemento de colección (clave-valor), use dos uno al lado del otro Se representan los nodos de ziplist. El primer nodo contiene los miembros de los elementos de la colección y el segundo nodo contiene las puntuaciones de los elementos de la colección. Dentro de la lista comprimida, los elementos del conjunto se ordenan según la puntuación de menor a mayor.

2. Codificación de lista de omisiones

Cuando el número de elementos es mayor que 128 y la longitud de todos los miembros del elemento es mayor que 64 bytes, se usa la codificación skiplist y zset se usa internamente para guardar datos.

Inserte la descripción de la imagen aquí

Finalmente, resumimos los cinco tipos de datos y la codificación utilizada:

Inserte la descripción de la imagen aquí
28 de abril de 2020

Supongo que te gusta

Origin blog.csdn.net/weixin_43907422/article/details/105728058
Recomendado
Clasificación