Subjacente a estrutura de codificação RDB e persistência

A: Kernel

RDB funções principais das duas funções é rdbSave e rdbLoad

1: A função rdbSave é responsável pelos dados do banco de dados na memória são guardadas no disco para o formato RDB, RDB se o arquivo já existe, o novo arquivo irá substituir o arquivo RDB RDB existente.

2: rdbLoad para o arquivo de dados RDB para recarga de memória

 

Dois: o estado de implementação do SAVE e BGSAVE

arquivos RDB durante o armazenamento, o processo principal será bloqueado até que o salvamento for concluído.

dois comandos SAVE e BGSAVE vai chamar a função rdbSave, mas eles são chamados de diferentes maneiras:

1: salvar chamadas diretas rdbSave, bloqueando o processo principal Redis até guardar estiver concluída. Durante o processo principal bloqueada, o servidor não pode lidar com quaisquer pedidos de clientes.

2: BGSAVE o garfo um processo filho, o processo filho é responsável por chamar rdbSave, e envia um sinal para o processo principal após o salvamento estiver concluído, salvar a notificação tenha sido concluída. Porque rdbSave é chamado o processo filho, então servidor Redis pode continuar a solicitações do cliente processo durante a execução BGSAVE.

competição

Como mencionado anteriormente, quando a execução SAVE, servidor Redis é bloqueado, então quando SALVAR está sendo executado, o novo SAVE, chamadas BGSAVE ou BGREWRITEAOF não terá qualquer efeito.

Apenas em uma SALVAR terminar, reinicie Redis depois de aceitar o pedido, o novo SAVE, BGSAVE ou ordem BGREWRITEAOF serão processados.

Além disso, porque a escrita é completada pelo AOF discussão de fundo, e BGREWRITEAOF pelo processo filho para completar, assim, no decurso da execução do SAVE, AOF escrito e BGREWRITEAOF ser realizadas simultaneamente.

BGSAVE

Antes de executar o comando SAVE, o servidor verifica se BGSAVE sendo implementada, e se assim for, o servidor não chamar rdbSave, mas devolvido ao cliente um revelador mensagem de erro durante a execução BGSAVE não pode ser realizada SAVE.

Isso evita que chamam o SAVE e BGSAVE dois rdbSave execução cruz, resultando em condições competitivas.

Por outro lado, quando BGSAVE sendo executado, ligue para o novo comando BGSAVE do cliente recebe um BGSAVE mensagem reveladora de erro já está sendo implementada-los.

BGREWRITEAOF e BGSAVE não pode executar:

Se BGSAVE sendo executado, a solicitação reescrita BGREWRITEAOF será adiada até depois da conclusão da execução BGSAVE, comando de execução BGREWRITEAOF do cliente recebe um pedido para ser adiada resposta.

Se BGREWRITEAOF sendo executado, então os clientes chamada BGSAVE receberá uma mensagem de erro indicando que os dois comandos não podem ser executados simultaneamente.

BGREWRITEAOF e BGSAVE dois comandos em operação e não há conflito, onde eles simplesmente não pode executar uma considerações de desempenho, ao mesmo tempo, e emitiu dois sub-processos, e os dois sub-processos são ao mesmo tempo um grande número de gravações em disco, como quer não seria uma boa idéia.

Três: Carregando

Quando o servidor inicia Redis, função rdbLoad será realizada, ele lê o RDB arquivo, eo arquivo de dados do banco de dados carregados na memória.

Durante o carregamento, carga por Server 1000 uma vez para lidar com todos os pedidos que chegaram, mas apenas solicitar publicar, subscrever, PSUBSCRIBE, UNSUBSCRIBE, PUNSUBSCRIBE cinco comandos serão processados ​​corretamente, todas as outras comando retornará um erro. Esperar até depois de o carregamento for concluído, o servidor começará normal de processamento de todos os comandos.

 

Quatro: estrutura de arquivos RDB

1: REDIS

No início da maioria dos documentos preservados REDIS cinco personagens identificar o início de um arquivo RDB. Ao ler um arquivo, o programa pode verificar os cinco primeiros bytes de um arquivo, para determinar rapidamente se o arquivo pode ser um RDB arquivo.

2: db_version

Um inteiro de quatro bytes em caracteres, a gravação do número de versão do arquivo do RDB é usado. A versão atual do RDB arquivo de 0006. Como diferentes versões dos arquivos RDB não são compatíveis, por isso, enquanto a leitura do programa, dependendo da versão necessária para escolher uma forma diferente de leitura.

3: check_sum é um inteiro sem sinal de 8 bytes, e contém uma soma de verificação, a soma de verificação é calculada pelo programa da matéria conteúdo REDIS, db_version, bases de dados, EOF quatro porções derivadas. arquivo de carga do servidor RDB, os dados de verificação de carga calculada check_num soma de verificação registrados e comparados para verificar se ou corrompido RDB erro de arquivo. Se este campo é 0, indica Redis fechado função de soma de verificação.

4: comprimento constante EOF é 1 byte, este constantes marcas de arquivo RDB o final do conteúdo do texto

5: bancos de dados

Ele contém 0 ou qualquer número de bancos de dados, cada tecla banco de dados e dados. Cada arquivo RDB banco de dados não-vazia podem ser salvos como três partes SELECTDB, db_number, key_value_pairs.

5.1: comprimento constante SELECTDB é 1 byte, quando o valor de leitura é encontrado, ele sabe para ser lido próximo será um banco de dados número

5.2: banco de dados db_number detém um número, o número de acordo com o tamanho, o seu comprimento pode ser um byte, 2 bytes, ou 5 bytes. O servidor seguida, chama o comando SELECT, um interruptor de banco de dados de acordo com a ler o número de banco de dados.

5.3: banco de dados de valor-chave em PARES mantém todos os dados importantes.

1: sem tempo de expiração da chave do arquivo na RDB do tipo, chave, valor de três partes

TIPO tipo valor registado, o comprimento de um byte, o valor pode ser um dos seguintes 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

chave e valor são preservados objetos-chave e pares de valores chave de objeto:

Em que a chave é sempre um objeto string, e seu valor de codificação REDIS_RDB_TYPE_STRING do mesmo tipo. Dependendo do tamanho do conteúdo, a chave será diferente.

Dependendo dos diferentes tipos de TYPE, e salvar o conteúdo do comprimento do valor armazenado eo comprimento da estrutura será diferente

 

2: Chave com um tempo de expiração para os EXPIRETIME_MS adicionados e ms

comprimento constante EXPIRETIME_MS é 1 byte, que narra programa, para ser lido próxima será um milissegundos vez expirado o na leitura.

ms é um inteiro assinado de 8 bytes, é registrada em milissegundos timestamp UNIX, a hora é o tempo de expiração dos pares chave-valor.

 

valor

Cada ficheiro valor RDB secção são armazenados um valor objectivo, o valor de cada tipo de objecto, a gravação de tipo correspondente, dependendo do tipo da parte do valor da estrutura, o comprimento pode variar.

1: objeto string

Se o valor de REDIS_RDB_TYPE_STRING TIPO, em seguida, o valor é armazenado num objecto de corda, o objecto pode ser codificado REDIS_ENCODING_INT corda ou REDIS_ENCODING_RAW.

Dependendo do comprimento da corda, não há compressão ea compressão duas maneiras de salvar a string:

Se a string é inferior a 20 bytes, o texto será armazenado diretamente diretamente.

Se a string é maior do que 20 bytes, em seguida, o texto será armazenado após a compressão.

Para cadeia não é comprimido, RDB vai len, save estrutura string. parcela corda detém a string valor em si, eo comprimento len do valor de cadeia é armazenado

Para cordas comprimido, RDB será salvo REDIS_RDB_ENC_LZF, compressed_len, origin_len, estrutura compressed_string. REDIS_RDB_ENC_LZF constante marcação algoritmo de compressão cadeia LZF que foi passado, o qual é registado comprimento de cadeia compressed_len depois de ser comprimido, e é registada origin_len comprimento original da cadeia de caracteres, compressed_string corda é registada depois de ter sido comprimida

 

2: objeto de lista

Se o valor TIPO REDIS_RDB_TYPE_LIST, então o valor é armazenado em uma lista REDIS_ENCODING_LINKEDLIST codificado de objetos. RDB será guardado como estrutura list_length, item. list_length gravar o comprimento da lista, que lista os registros contém o número de itens (itens), o programa pode ler este comprimento deve saber quantos lista de itens para ler. parte item de item representa o início da lista, porque cada item da lista é um objeto string, então o programa vai ser tratado em um objeto string para segurar e ler uma lista de itens.

 

 


A primeira estrutura é um comprimento de três dígitos da lista, em seguida, seguida pelo primeiro item da lista, respectivamente, o segundo e o terceiro item lista de itens da lista, em que:

A duração do primeiro item da lista é 5, o conteúdo de uma string "Olá".

O comprimento do segundo item da lista 5 também, o conteúdo do "mundo" de uma string.

O comprimento do terceiro item da lista para 1, o conteúdo da string "!".

 

 

3: uma coleção de objetos e uma lista de objetos armazenados na mesma estrutura

 

4: objeto Hashtable

Se o valor TIPO REDIS_RDB_TYPE_HASH, então o valor é uma coleção de objetos armazenados em um REDIS_ENCODING_HT codificação. arquivo RDB será salvo em um key_value_pair estruturado e de hash_size.

registros hash_size o tamanho da tabela de hash, ou seja, a tabela hash contém o número de pares chave-valor pode ser lido no programa pelo tamanho eles devem saber quantas chaves leu direito.

Na porção tabela hash representa o início da pares de valores chave key_value_pair, chave e par de chaves-valor é objecto da corda, para que o programa vai ser processado de uma maneira para prender o objecto de cadeia e ler pares.

 

Nesta configuração exemplificativa, uma gravação digital do número de hash chave da tabela, é então seguido por dois pares de valores chave:

O primeiro par de chaves é uma seqüência chave de "a" 1, o valor do comprimento da "maçã" string 5.

A segunda chave é um par de valor-chave é uma seqüência de 1 de "b", o valor é uma seqüência de "banana" 6 in.

 

5: uma coleção ordenada de objetos

Se o valor TIPO REDIS_RDB_TYPE_ZSET, então o valor é uma coleção ordenada de objetos armazenados em um REDIS_ENCODING_SKIPLIST codificação.

RDB será guardado como sorted_set_size e estrutura elemento.

sorted_set_size registra o tamanho do conjunto classificado, isto é, quanto para salvar a coleção ordenada de elementos de ler as necessidades do programa para decidir o quanto deve ser lido em um conjunto ordenado de elementos de acordo com este valor.

No início do representante seção de elemento de um conjunto ordenado de elementos, cada elemento é dividido em um membro (Membro) e pontuação (Score) em duas partes, é membro de um objeto string, a pontuação é um tipo de ponto flutuante double, primeiro objeto programa é convertido para um valor de string ao salvar um RDB arquivo e, em seguida, usar um método para salvar o valor objeto string salvo.

 

O primeiro número 2 grava o número de elementos de um conjunto ordenado, em seguida, seguidos por um conjunto ordenado de dois elementos:

Membro do primeiro elemento é uma sequência de comprimento 2 de "pi", para uma cadeia de comprimento de 4 "3,14" após o valor é convertido em uma cadeia.

Os membros do segundo elemento é uma cadeia de comprimento 1, "e", para uma cadeia de comprimento 3 "2,7", após o valor é convertido em uma cadeia.

 

Coleção IntSet codificação

Se o valor da REDIS_RDB_TYPE_SET_INTSET método TYPE, em seguida, o valor armazenado é um conjunto de objetos inteiros, tais objetos arquivo RDB é salvo, o conjunto de primeiro convertido para um objeto string inteiro, e salvar o objeto String para um arquivo dentro RDB.

Se o RDB processo do programa ler arquivos, conjuntos de transições encontradas por um objeto inteiro para um objeto String, então o programa de acordo com um valor de tipo de instrução, leia primeiro os objetos de cadeia de caracteres, e depois convertê-lo em objeto string original inteiros objeto.

 

ZIPLIST lista codificado, tabela hash ou uma coleção ordenada

Se o valor TIPO REDIS_RDB_TYPE_LIST_ZIPLIST, REDIS_RDB_TYPE_HASH_ZIPLIST ou REDIS_RDB_TYPE_ZSET_ZIPLIST, então o valor é comprimir uma lista de objetos, arquivo RDB salvar este objeto é salvo:

Uma lista de compressão é convertido em um objeto string.

O objeto string resultante para salvar o arquivo convertido para o RDB.

Se o RDB processo do programa ler um documento, uma lista de objetos encontrados pela compressão convertido em um objeto string, com base no valor indicação tipo de programa, execute as seguintes operações:

Leitura objeto string e converte-o na lista original comprimido de objetos.

O valor do tipo é fornecida uma lista de objectos tipo de compressão: Se TIPO é o tipo de valor REDIS_RDB_TYPE_LIST_ZIPLIST, então, a lista de objectos é uma lista da compressão; tipo, se o REDIS_RDB_TYPE_HASH_ZIPLIST valor TIPO, então a lista comprimida de objectos para uma tabela hash; se o valor do tipo como REDIS_RDB_TYPE_ZSET_ZIPLIST, em seguida, o tipo de lista de compressão de objetos do conjunto ordenado.

Publicado 50 artigos originais · ganhou elogios 2 · Vistas 2300

Acho que você gosta

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