Redis implementação subjacente de cinco tipos de dados

breve introdução

Redis cinco cinco tipos de dados chamado objecto de dados; 6 descritos anteriormente estruturas de dados grandes, Redis não usar estas estruturas para implementar a chave para a base de dados, mas estas estruturas são utilizados para construir um sistema de redisObject objecto; O sistema contém alvo cinco dados, cordas (string), uma lista de objectos (lista), o objeto de hash (hash), uma colecção (conjunto) de um conjunto ordenado de objectos e objectos (zset); e os dados da camada inferior que codificam as cinco objectos podem ser encomendados objecto Codificação para visualizá-lo.

estrutura redisObject

typedef struct redisObject {
    // 类型
    unsigned type:4;
    // 编码
    unsigned encoding:4;
    // 指向底层实现数据结构的指针
    void *ptr;
    // ...
} robj;

Redis são pares chave-valor de dados armazenados, assim que o objeto é dividido em objetos e objetos de valor-chave, que é um armazenamento de chave-valor pares chave-valor irá criar dois objetos, objetos-chave e objetos de valor.
objeto Key é sempre um objeto string, eo valor do objeto pode ser qualquer um dos cinco objetos.

  • atributo de tipo é o tipo de armazenamento de objetos, ou seja, dizemos que a corda, lista, mistura, conjunto, zset de um, você pode usar a tecla de comando TYPE para a vista.
  • que codifica ficha atributo usado pela formação de codificação, isto é, quais as estruturas de dados utilizadas para conseguir o objectivo subjacente.

Aqui Insert Picture Descrição
A tabela apresenta a saída correspondentes para o comando subjacente código e as constantes de objeto de codificação, os três primeiros são estrutura cordas

Quando depositamos key-value e par chave-valor não for especificado codificação de objeto, mas Redis será definido de acordo com o sistema sem o uso de uma cena de objeto é codificação diferente, até economizar memória, acelerar o propósito da velocidade visita.

objeto String (string)

estrutura de dados subjacente corda objecto implementado como um simples cordas dinâmicas (SDS) e armazenados directamente, mas em modo de codificação pode ser int, cru ou embstr, excepto que as diferentes estruturas de memória.

(1) int codificação

É um valor inteiro armazenado em uma corda, e isso pode ser formalmente representado como um tipo longo, então ele vai ser armazenados diretamente no atributo PTR redisObject de, o conjunto int codificado, como mostrado:
Aqui Insert Picture Descrição

(2) codificada em bruto

Valor maior do que 32 bytes cadeia armazenada corda, uma simples cordas dinâmicas (SDS) a estrutura, e que codifica para bruto, este tempo é consistente com a estrutura de memória estrutura de SDS, é o dobro do número de alocação de memória, criar objectos redisObject e estrutura sdshdr, como mostrado:
Aqui Insert Picture Descrição

(3) embstr codificação

String String valor armazenado menor ou igual a 32 bytes, é também simples de usar cordas dinâmicas (estrutura SDS), mas a arquitetura de memória é otimizado para uma string armazenada Dunxiao; memória necessidade de alocação apenas uma vez para ser concluída, um espaço contínuo pode ser alocado como:
Aqui Insert Picture Descrição
cordas resumo objeto:

  • Em Redis, o armazenada por muito tempo, duplo tipo de ponto flutuante é então convertido para uma cadeia armazenada.
  • e codificação efeito embstr matéria é o mesmo, exceto que a alocação de memória e liberação, cru duas vezes, uma embstr.
  • embstr bloco contínuo de memória, o cache pode fazer melhor uso das vantagens de
  • código int e anexando a cadeia embstr codificação e outras operações, se for feito, será convertido para o estado de codificação em bruto é satisfeita; embstr codificação objecto é lido, uma vez que a primeira modificação serão transcodificados para cru.

Lista de objetos (lista)

Antes da versão 3.2: codificado lista de objetos que podem ser ziplist e um LinkedList.

(1) codificação ziplist

de hash ziplist codificação implementação subjacente Caprice é uma lista de compressão, cada nó comprimido na lista contém um elemento da lista.
Aqui Insert Picture Descrição

(2) ListaLigada codificação

LinkedList codificação fim fundo duplo de implementação lista ligada, cada um do nó lista ligada terminou dupla mantém um objeto String, para economizar os elementos da lista dentro de cada objeto string.
Aqui Insert Picture Descrição
Lista de objetos transcodificação:

  • Uma lista de objectos utilizando necessidade de codificação ziplist para satisfazer duas condições: Em primeiro lugar, todas as cordas são menores do que 64 bytes, a segunda é menos do que o número de elementos 512, vai ser usado não satisfaz qualquer uma das ListaLigada codificação.
  • duas condições digitais pode ser modificado no arquivo de configuração Redis, opção de lista-max-ziplist-valor e uma opção de lista-max-ziplist-entradas.
  • FIG StringObject é uma cadeia de caracteres em objetos mencionados, o único objectivo de cadeia é usado como um objeto aninhado no objecto cinco.

Após a versão 3.2: a lista quicklist codificação de objetos.

quicklist codificação

quicklist zipList e é uma mistura de ListaLigada, ele secção de prensa ListaLigada segmentado, cada segmento zipList usadas para armazenamento compacto, ligadas em série entre uma pluralidade ponteiro bidireccional zipList.
Aqui Insert Picture Descrição
Aqui Insert Picture Descrição
Redis será no armazenamento comprimido ziplist, algoritmo de compressão de uso LZF, você pode selecionar uma profundidade de compressão.
profundidade de compressão padrão quicklist é 0, que não é comprimido. A profundidade real da compressão é determinado pelo parâmetro de configuração lista-compressa profundidade. Para apoiar as operações push / pop rápidas, inclusive de dois quicklist ziplist não comprimido, em seguida, a profundidade é de 1. Se a profundidade é de dois, que significa uma primeira extremidade quicklist ziplist de extremidade e uma segunda extremidade à outra ziplist não comprimida.
comprimento ziplist:
ziplist comprimento padrão único quicklist interno é 8k bytes, para além deste número de bytes será uma nova ziplist de partida.
ziplist comprimento da lista máximo-ziplist-tamanho determinado pelos parâmetros de configuração.

objeto Hash (Hash)

Codificado objeto hash pode ser ziplist e uma tabela de dispersão.

(1) codificação ziplist

implementação subjacente codificado objeto hash ziplist é lista comprimido, o hash codificação sujeito ziplist, chave de valor por meio da chave na lista de compressão estreitamente ligada, a primeira chave na extremidade da mesa, e em seguida, em valor; valor-chave é sempre adicionado à extremidade da mesa.
Aqui Insert Picture Descrição

(2) que codifica tabela hash

hashtable objeto hash subjacente é conseguido dicionário de codificação, cada um dos objetos pares de valores chave de hash utilizar um dicionário para memorizar o par de chaves de valor.
Valor-chave par que é o dicionário, as chaves de dicionário e valores estão corda objeto de dicionário para salvar a chave do valor-chave, o valor do dicionário de valores-chave armazenadas de valor.
Aqui Insert Picture Descrição
Hash conversão de código objeto:

  • Ziplist de hash que codificam usos objecto preciso reunir duas condições: valores de chave e comprimento de cadeia do primeiro, todas as chaves estão a menos de 64 bytes, a segunda é menos do que o número de pares de valores chave 512; não satisfazer uma utilização qualquer tabela hash codificação .
  • O acima duas condições pode ser opção de hash-max-ziplist-valor e o hash-Max-ziplist-entradas opção perfil Reids em modificado.

Um conjunto de objectos (conjunto)

coleção codificada de objetos pode ser IntSet e um hashtable.

(1) IntSet codificação

recolha de objectos subjacentes IntSet conjunto codificado de inteiros é alcançado, todos os elementos são armazenadas em um conjunto de números inteiros.
Aqui Insert Picture Descrição

(2) que codifica tabela hash

implementação subjacente de recolha de objectos tabela hash é codificado dicionário, o dicionário de cada chave é um objecto da corda, para guardar um elemento de recolha, excepto que os valores do dicionário são NULL; referem-se estrutura de hashset java.
Aqui Insert Picture Descrição
Transcodificação coleção de objetos:

  • IntSet codificado utilizando um conjunto de objectos preciso reunir duas condições: primeiro, todos os elementos são inteiro valores, o segundo é o número de elementos de menos do que ou igual a 512; não satisfaz qualquer uma vai usar tabela hash codificação.
  • Mais segunda condição pode ser modificado de et-Max-IntSet-entradas opção ficheiro de configuração Redis.

conjunto ordenado de objectos (zset)

conjunto ordenado de codificação pode ser ziplist e um skiplist.

(1) codificação ziplist

Um conjunto ordenado de objectos é conseguida a lista compressão codificação ziplist subjacente, que é semelhante à estrutura do objecto de hash, excepto que a lista de duas intimamente ligada compressão de nodos, o valor do primeiro membro de suporte dos elementos, os segundos elementos armazenados, e valor pequeno perto do cabeçalho, rodapé e próximo grande.
Aqui Insert Picture Descrição

(2) skiplist codificação

um conjunto ordenado de objectos é conseguido o skiplist subjacente codificava dois tipos de salto e dicionários;
cada nó mantém um elemento de tabela hop recolha, e prima do valor em ordem ascendente; objecto do nó de armazenamento atributo dos elementos de membro, atributo pontuação prende pontuação;
dicionário de cada chave para salvar um elemento de coleção, os membros dos elementos-chave para salvar o dicionário, e os valores de dicionário são dezenas salvos.
Aqui Insert Picture Descrição
Por skiplist codificação para usar tanto saltar e dicionários de alcançar?

  • Tabela vantagem salto é ordenada, mas a pontuação da consulta complexidade O (log n); consulta dicionário complexidade pontuação S (1), mas a doença, de modo que mesmo um pouco ser implementada em conjunto com a estrutura.
  • Embora o uso de membros elementares e duas pontuações, mas a estrutura da coleção é compartilhada pelas duas estruturas ponteiro para o mesmo endereço, sem memória desperdício.

conjunto ordenado de conversão que codifica:

  • Que codifica o objecto da colecção ordenada utiliza necessidade ziplist para satisfazer duas condições: primeiro, todos os elementos de um comprimento inferior a 64 bytes, o segundo é o número de elementos de menos do que 128; um não satisfazem qualquer uma das condições utilizadas skiplist codificação.
  • O acima duas condições podem ser modificados zset-max-ziplist-entradas e opções zset-ziplist valor máximo arquivo de configuração Redis opção.

cenários

Redis cenários gerais

  • sessão cache (single sign-on)
  • Distribuído Lock, tais como: o uso de setnx
  • Ou listas de melhores balcão
  • Lista de Produtos, ou listas de base de dados do usuário, etc.
  • Colunas usando a lista como a mensagem
  • Spike, inventário e outras deduções

Cinco tipos de cenários de aplicação

  • Corda, KV redis para operação de alta eficiência pode ser utilizada directamente como um contador. Por exemplo, o número de estatísticas online, etc, o outro tipo é uma cadeia de segurança de armazenamento binário, de modo que você pode usá-lo para armazenar imagens e até mesmo vídeo.
  • hash armazenado um par de chaves de valor pode ser geralmente utilizada para manter a informação de atributos de base de um objecto, por exemplo, informações de utilizador, a informação do produto, etc. Além disso, uma vez que o tamanho do hash utilizada é menor do que o tamanho configurado quando a estrutura é ziplist, mais custo memória, assim, para um grande número de armazenamento de dados podem ser considerados para utilizar o hash para atingir a quantidade de fragmentação de compressão de dados, para fins de poupança de memória, por exemplo, para o nome da imagem de endereço correspondentes às grandes quantidades de bens. Por exemplo: um código de mercadoria fixo é de 10 bits, o primeiro pode ser seleccionado como um hash de chave 7, após um período de três campo de imagem, como um valor de endereço. Cada tabela hash para que não mais do que 999, enquanto o redis.conf de hash-max-ziplist-entradas foi mudado para 1024, pode.
  • lista, tipo de lista, pode ser usado para implementar a fila de mensagens, você também pode usá-lo para fornecer um comando de gama, fazer consultas de paginação.
  • conjunto, coleção, lista ordenada de números inteiros podem ser usados ​​diretamente definido. Algumas funções de peso pode ser usado para, por exemplo, um nome de utilizador não pode ser repetido, etc. Além disso, também pode ser conjunto intersecção, e operações de conjunto, certos elementos comuns para encontrar
  • zset, conjunto ordenado, pode ser usado para encontrar o intervalo, leaderboards ou função TopN.

resumo

Em cinco dos dados objeto Redis, objeto corda é o único dos outros quatro pode ser incorporado como um objecto de dados de destino;

Lista (lista), de hash (hash), conjunto (SET), um conjunto ordenado (zset) subjacente implementação utiliza tanto a estrutura lista condição comprimida, uma estrutura de lista usando uma compressão relativamente pequena e são em número de elementos, o comprimento do byte caso de curto;

A vantagem de utilizar a lista de quatro compressão de dados de objectos:
(1) excepto a memória, reduzir a sobrecarga de memória, a base de dados de memória Redis é, por conseguinte, reduzir a sobrecarga de memória é necessário, em certas circunstâncias.
(2) reduzir a fragmentação de memória, compressão lista bloco de memória é contínuo, e o número de memória alocada uma vez.
(3) comprimindo a nova lista, de apagamento, a operação de busca de complexidade média tempo é O (N), N em um determinado intervalo de novo, desta vez é quase insignificante, e o valor limite superior de N é configurável .
(4) quatro objecto de dados tem duas estrutura de codificação, o aumento da flexibilidade.

Publicado 158 artigos originais · Louvor obteve 119 · vista 810 000 +

Acho que você gosta

Origin blog.csdn.net/u013474436/article/details/104481591
Recomendado
Clasificación