Subyacente estructura de codificación RDB y persistencia

R: Kernel

RDB funciones básicas de las dos funciones es rdbSave y rdbLoad

1: Función rdbSave es responsable de los datos de base de datos en la memoria se guarda en disco al formato RDB, RDB si el archivo ya existe, el nuevo archivo reemplazará el archivo RDB RDB existente.

2: rdbLoad para el archivo de datos RDB en la memoria de recarga

 

Dos: el estado de aplicación de SAVE y BGSAVE

archivos RDB durante el almacenamiento, el proceso principal se bloquearán hasta que se complete el proceso de almacenamiento.

SAVE y BGSAVE dos comandos llamarán función rdbSave, pero se les llama de diferentes maneras:

1: SAVE llamadas directas rdbSave, el bloqueo del proceso principal Redis hasta el almacenamiento se haya completado. Durante el proceso principal bloqueado, el servidor no puede manejar todas las solicitudes del cliente.

2: BGSAVE el tenedor un proceso hijo, el proceso hijo es responsable de llamar rdbSave, y envía una señal al proceso principal después de que el almacenamiento se haya completado, excepto la notificación ha sido completado. Debido rdbSave se llama el proceso hijo, por lo que el servidor Redis puede seguir peticiones de los clientes durante la ejecución del proceso de BGSAVE.

competencia

Como se mencionó anteriormente, cuando la ejecución SAVE, Redis servidor se bloquea, por lo que cuando se ejecuta SAVE, el nuevo SAVE, BGSAVE o BGREWRITEAOF llamadas no tendrá ningún efecto.

Sólo en una GUARDAR terminado, reinicie Redis después de aceptar la solicitud, la nueva SAVE, BGSAVE u orden BGREWRITEAOF serán procesados.

Además, debido a que la escritura se completa con el AOF fondo de rosca, y BGREWRITEAOF por el proceso hijo para completar, por lo que en el curso de la aplicación SAVE, la escritura y la AOF BGREWRITEAOF llevarse a cabo de forma simultánea.

BGSAVE

Antes de realizar el comando SAVE, el servidor comprueba si BGSAVE llevando a cabo, y si es así, el servidor no llama rdbSave, pero devuelve al cliente un mensaje de error durante la ejecución revelador BGSAVE no se puede realizar GUARDAR.

Este llamado los dos rdbSave ejecución cruz SAVE y BGSAVE, resultantes en condiciones de competencia Evita.

Por otro lado, cuando se ejecuta BGSAVE, llame al nuevo comando BGSAVE del cliente recibe un mensaje de error revelador BGSAVE que ya se les implementado.

BGREWRITEAOF y BGSAVE no pueden realizar:

Si BGSAVE está ejecutando, entonces la petición de reescritura BGREWRITEAOF se pospondrá hasta después de la finalización de la ejecución BGSAVE, BGREWRITEAOF comando de ejecución del cliente recibe una petición de que se retrase la respuesta.

Si BGREWRITEAOF está ejecutando, entonces los clientes llamada BGSAVE recibirán un mensaje de error que indica que los dos comandos no se pueden ejecutar simultáneamente.

BGREWRITEAOF y BGSAVE dos comandos en funcionamiento y no hay ningún conflicto en el que simplemente no puede realizar una consideraciones de rendimiento, al mismo tiempo, y emitieron dos sub-procesos, y los dos sub-procesos son al mismo tiempo un gran número de escrituras en disco, la forma en que quiere no sería una buena idea.

Tres: Loading

Cuando se inicia el servidor Redis, se llevará a cabo la función rdbLoad, lee el archivo de RDB, y el archivo de datos de base de datos de carga en la memoria.

Durante la carga, la carga por servidor 1000 tecla una vez para hacer frente a todas las solicitudes que han llegado, pero sólo solicitar publicar, suscribir, PSUBSCRIBE, darse de baja, PUNSUBSCRIBE cinco órdenes será procesada correctamente, todas las demás comando devuelve un error. Esperar hasta después de que la carga está completa, el servidor comenzará normal de procesamiento de todos los comandos.

 

Cuatro: estructura de archivos RDB

1: REDIS

Al principio de la mayoría de los documentos que se conservan SRID cinco caracteres identifican el comienzo de un archivo de RDB. En la lectura de un archivo, el programa puede comprobar los primeros cinco bytes de un archivo, para determinar rápidamente si el archivo puede ser un archivo de RDB.

2: db_version

Se utiliza un número entero de cuatro bytes en caracteres, registrando el número de versión del archivo de la RDB. La versión actual del archivo de RDB 0006. Debido a que diferentes versiones de los archivos RDB no son compatibles, por lo que al leer el programa, dependiendo de la versión necesaria para elegir una forma diferente de la lectura.

3: check_sum es un entero sin signo de 8 bytes, y tiene una suma de comprobación, la suma de comprobación se calcula por el programa de la materia contenido REDIS, db_version, bases de datos, EOF cuatro porciones derivan. archivo de carga del servidor RDB, los datos de verificación de carga calculada check_num suma de control registrará y comparará para comprobar si está dañado o RDB error de archivo. Si este campo es 0, indica Redis cerró la función de suma de comprobación.

4: EOF longitud constante es de 1 byte, esta constante marcas de archivo RDB al final del contenido del texto

5: bases de datos

Contiene 0 o cualquier número de bases de datos, cada base de datos y datos clave. Cada archivo de base de datos RDB no vacío puede ser guardado como tres partes SELECTDB, DB_NUMBER, key_value_pairs.

5.1: SELECTDB longitud constante es de 1 byte, cuando se encuentra el valor de lectura, se sabe que se lea a continuación será una base de datos de número

5.2: base de datos DB_NUMBER tiene un número, el número en función del tamaño, su longitud puede ser de 1 byte, 2 bytes, o 5 bytes. Después, el servidor llama al comando SELECT, un interruptor de la base de datos de acuerdo a leer el número de bases de datos.

5.3: Base de datos de clave y valor de pares tiene todos los datos clave.

1: sin tiempo de caducidad de la clave del archivo en la RDB del tipo, clave, valor de tres piezas

TIPO tipo valor registrado, longitud de 1 byte, el valor puede ser uno de las siguientes constantes:

REDIS_RDB_TYPE_STRING

REDIS_RDB_TYPE_LIST

REDIS_RDB_TYPE_SET

REDIS_RDB_TYPE_ZSET

REDIS_RDB_TYPE_HASH

REDIS_RDB_TYPE_LIST_ZIPLIST

REDIS_RDB_TYPE_SET_INTSET

REDIS_RDB_TYPE_ZSET_ZIPLIST

REDIS_RDB_TYPE_HASH_ZIPLIST

clave y el valor se conservan objetos clave y pares de valores clave de objeto:

En el que la clave es siempre un objeto de cadena, y su valor de codificación REDIS_RDB_TYPE_STRING del mismo tipo. Dependiendo del tamaño del contenido, la clave será diferente.

Dependiendo de los diferentes tipos de TYPE, y guardar el contenido de la longitud del valor almacenado y la longitud de la estructura será diferente

 

2: Clave con un tiempo de expiración para los EXPIRETIME_MS añadidos y ms

EXPIRETIME_MS longitud constante es de 1 byte, que indica al programa, que debe leerse junto será un tiempo de milisegundos expiró en lectura.

Ms es un entero de 8 bytes, se registra en un milisegundos timestamp UNIX, la marca de tiempo es el tiempo de expiración de los pares de valores clave.

 

valor

Cada archivo de valor RDB sección se almacenan un objeto de valor, el valor de cada tipo de objeto por el correspondiente de impresión de tipo, dependiendo del tipo de la parte del valor de la estructura, la longitud puede variar.

1: objeto de cadena

Si el valor de tipo REDIS_RDB_TYPE_STRING, entonces el valor se almacena en un objeto de cadena, el objeto puede ser codificada REDIS_ENCODING_INT cadena o REDIS_ENCODING_RAW.

Dependiendo de la longitud de la cadena, no hay compresión y la compresión de las dos formas de ahorrar la cadena:

Si la cadena es menor de 20 bytes, la cadena estará directamente almacena directamente.

Si la cadena es mayor que 20 bytes, entonces la cadena se almacenará después de la compresión.

Para cadena no se comprime, se len RDB, excepto estructura de cadena. porción de hilo tiene el valor de cadena en sí, y la longitud len del valor de cadena se almacena

Para cadena comprimida, RDB se guardará REDIS_RDB_ENC_LZF, compressed_len, origin_len, compressed_string estructura. REDIS_RDB_ENC_LZF constante marcado algoritmo de compresión de cadena LZF que se ha pasado, que se registra longitud de la cadena compressed_len después de ser comprimido, y se registra origin_len longitud original de la cadena, compressed_string cadena se registra después de ser comprimido

 

2: Lista de objetos

Si el valor TIPO REDIS_RDB_TYPE_LIST, entonces el valor se almacena en una lista REDIS_ENCODING_LINKEDLIST codificada de objetos. RDB se guardará como estructura list_length, artículo. list_length registrar la longitud de la lista, que contiene la lista de los registros el número de elementos (punto), el programa puede leer a través de esta longitud debe saber cuántos elementos de la lista para leer. Punto a punto representa el comienzo de la lista, ya que cada elemento de la lista es un objeto de cadena, por lo que el programa se maneja en un objeto de cadena para sostener y leer una lista de artículos.

 

 


La primera estructura es una longitud de 3 dígitos de la lista, a continuación, seguido por el primer elemento de la lista, respectivamente, el segundo y tercer elemento de lista elementos de lista, en el que:

Una longitud del primer elemento de la lista es 5, el contenido de una cadena "Hola".

La longitud del segundo elemento de la lista 5 también, el contenido de un "mundo" cadena.

La longitud de la tercera entrada de la lista a 1, el contenido de la cadena "!".

 

 

3: una colección de objetos y una lista de objetos almacenados en la misma estructura

 

4: objeto Hashtable

Si el valor TIPO REDIS_RDB_TYPE_HASH, entonces el valor es una colección de objetos almacenados en un REDIS_ENCODING_HT codificación. RDB archivo se guardará en un key_value_pair estructurado y de hash_size.

registros hash_size el tamaño de la tabla hash, es decir, la tabla hash tiene el número de pares de valores clave pueden ser leídos en el programa por el tamaño que deben saber cuántas llaves leído bien.

En la porción de tabla hash representa el comienzo de los pares de valores clave key_value_pair, clave y par clave-valor es objeto de cadena, por lo que el programa se procesa de una manera para mantener el objeto de cadena y leer pares.

 

En esta configuración ejemplar, una grabación digital del número clave de la tabla de hash, es seguido a continuación por dos pares de valores clave:

El primer par de claves es una cadena de clave de "a" 1, el valor de la longitud de la "Apple" cadena 5.

La segunda clave es un par clave-valor es una cadena de de 1 "b", el valor es una cadena de "banana" 6 en.

 

5: una colección ordenada de objetos

Si el valor TIPO REDIS_RDB_TYPE_ZSET, a continuación, el valor es una colección ordenada de objetos almacenados en la codificación de un REDIS_ENCODING_SKIPLIST.

RDB se guardará como sorted_set_size y estructura de los elementos.

sorted_set_size registra el tamaño del conjunto ordenado, es decir, cuánto ahorrar la colección ordenada de elementos de leer las necesidades del programa para decidir cuánto se debe leer en un conjunto ordenado de elementos de acuerdo con este valor.

En el principio de la sección de elemento representativo de un conjunto ordenado de elementos, cada elemento está dividido en un miembro (miembro) y anota (Puntuación) en dos partes, es un miembro de un objeto de cadena, la puntuación es de un tipo de coma flotante doble, primer objeto del programa se convierte en un valor de cadena al guardar un archivo de RDB y, a continuación, utilizar un método para guardar el valor objeto de cadena salvó.

 

El primer número 2 registra el número de elementos de un conjunto ordenado, a continuación, seguidos por un conjunto ordenado de dos elementos:

Miembro del primer elemento es una cadena de longitud 2 de "pi", en una cadena de longitud 4 "3,14" después de que el valor se convierte en una cadena.

Los miembros de la segundo elemento es una cadena de longitud 1, "e", en una cadena de longitud 3 "2.7" después de que el valor se convierte en una cadena.

 

Colección de codificación INTSET

Si el valor de REDIS_RDB_TYPE_SET_INTSET método de tipo, entonces el valor almacenado es un conjunto de números enteros objetos, estos objetos RDB archivo se guarda, el conjunto de primera convierte en un objeto de cadena entero, y guardar el objeto String en un archivo dentro de RDB.

Si el proceso de RDB programa lee los archivos, conjuntos de transiciones encontradas por un objeto entero a un objeto String, entonces el programa en función de un valor de tipo de instrucción, leyeron por primera vez los objetos de cadenas de caracteres, y luego convertirlo en el objeto cadena original enteros objeto.

 

ZipList lista codificada, tabla hash o una colección ordenada

Si el valor TIPO REDIS_RDB_TYPE_LIST_ZIPLIST, REDIS_RDB_TYPE_HASH_ZIPLIST o REDIS_RDB_TYPE_ZSET_ZIPLIST, entonces el valor es comprimir una lista de objetos, archivos RDB guardar este objeto se guarda:

Una lista de compresión se convierte en un objeto de cadena.

El objeto cadena resultante para guardar el archivo convertido a la RDB.

Si el proceso de RDB programa de lectura de documentos, una lista de los objetos encontrados por la compresión convierte en un objeto de cadena, basado en el valor que indica el tipo de programa, realice las siguientes operaciones:

Lectura objeto de cadena, y la convierte en la lista original comprimido de objetos.

El valor del tipo se proporciona una lista de objetos del tipo de compresión: Si el tipo es el tipo de valor REDIS_RDB_TYPE_LIST_ZIPLIST, a continuación, la lista de objetos es una lista de la compresión; tipo si el REDIS_RDB_TYPE_HASH_ZIPLIST valor de tipo, entonces la lista comprimida de objetos a una tabla hash, si el valor de tipo como REDIS_RDB_TYPE_ZSET_ZIPLIST, a continuación, el tipo de lista de compresión de objetos del conjunto ordenado.

Publicado 50 artículos originales · ganado elogios 2 · Vistas 2300

Supongo que te gusta

Origin blog.csdn.net/eafun_888/article/details/104714315
Recomendado
Clasificación