Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Quais são as estruturas de dados subjacentes usadas para o Redis?


Tentarei responder à sua pergunta, mas começarei com algo que pode parecer estranho à primeira vista:se você não estiver interessado em componentes internos do Redis, não deve se importar sobre como os tipos de dados são implementados internamente. Isso ocorre por uma razão simples:para cada operação do Redis, você encontrará a complexidade de tempo na documentação e, se tiver o conjunto de operações e a complexidade de tempo, a única outra coisa que você precisa é de alguma pista sobre o uso da memória (e porque fazemos muitas otimizações que podem variar dependendo dos dados, a melhor maneira de obter esses últimos números é fazendo alguns testes triviais do mundo real).

Mas como você perguntou, aqui está a implementação subjacente de todos os tipos de dados do Redis.
  • Cordas são implementados usando uma biblioteca de string dinâmica C para que não paguemos (assintoticamente falando) por alocações em operações de acréscimo. Dessa forma, temos anexos O(N), por exemplo, em vez de ter comportamento quadrático.
  • Listas são implementados com listas vinculadas.
  • Conjuntos e Hashes são implementados com tabelas de hash.
  • Conjuntos classificados são implementados com listas de salto (um tipo peculiar de árvores balanceadas).

Mas quando listas, conjuntos e conjuntos ordenados são pequenos em número de itens e tamanho dos maiores valores, uma codificação diferente e muito mais compacta é usada. Essa codificação difere para diferentes tipos, mas tem o recurso de ser um blob compacto de dados que geralmente força uma varredura O(N) para cada operação. Como usamos esse formato apenas para objetos pequenos, isso não é um problema; a varredura de um pequeno blob O(N) é esquecimento do cache então, na prática, é muito rápido e, quando há muitos elementos, a codificação é automaticamente alternada para a codificação nativa (lista vinculada, hash e assim por diante).

Mas sua pergunta não era apenas sobre internos, seu ponto era Que tipo usar para realizar o quê? .

Cordas


Este é o tipo básico de todos os tipos. É um dos quatro tipos, mas também é o tipo base dos tipos complexos, porque uma Lista é uma lista de strings, um Set é um conjunto de strings e assim por diante.

Uma string Redis é uma boa ideia em todos os cenários óbvios em que você deseja armazenar uma página HTML, mas também quando deseja evitar a conversão de seus dados já codificados. Então, por exemplo, se você tiver JSON ou MessagePack, você pode armazenar objetos como strings. No Redis 2.6, você pode até manipular esse tipo de lado do servidor de objetos usando scripts Lua.

Outro uso interessante de strings são bitmaps e, em geral, arrays de bytes de acesso aleatório, já que o Redis exporta comandos para acessar intervalos aleatórios de bytes, ou mesmo bits únicos. Por exemplo, verifique esta boa postagem no blog:Métricas em tempo real rápidas e fáceis usando o Redis.

Listas


As listas são boas quando você provavelmente tocará apenas os extremos da lista:perto da cauda ou perto da cabeça. Listas não são muito boas para paginar coisas, porque o acesso aleatório é lento, O(N). Então, bons usos de listas são filas e pilhas simples, ou processamento de itens em um loop usando RPOPLPUSH com a mesma origem e destino para "girar" um anel de itens.

As listas também são boas quando queremos apenas criar uma coleção limitada de N itens onde geralmente acessamos apenas os itens de cima ou de baixo, ou quando N é pequeno.

Conjuntos


Os conjuntos são uma coleta de dados não ordenada, portanto, eles são bons toda vez que você tem uma coleção de itens e é muito importante verificar a existência ou o tamanho da coleção de maneira muito rápida. Outra coisa legal sobre conjuntos é o suporte para espiar ou exibir elementos aleatórios (comandos SRANDMEMBER e SPOP).

Os conjuntos também são bons para representar relações, por exemplo, "Quais são os amigos do usuário X?" e assim por diante. Mas outras boas estruturas de dados para esse tipo de coisa são conjuntos ordenados, como veremos.

Os conjuntos dão suporte a operações complexas como interseções, uniões e assim por diante, portanto, essa é uma boa estrutura de dados para usar o Redis de maneira "computacional", quando você tem dados e deseja realizar transformações nesses dados para obter alguma saída.

Pequenos conjuntos são codificados de forma muito eficiente.

Haxes


Hashes são a estrutura de dados perfeita para representar objetos, composta por campos e valores. Campos de hashes também podem ser incrementados atomicamente usando HINCRBY. Quando você tem objetos como usuários, postagens de blog ou algum outro tipo de item , os hashes provavelmente são o caminho a seguir se você não quiser usar sua própria codificação, como JSON ou similar.

No entanto, lembre-se de que pequenos hashes são codificados de maneira muito eficiente pelo Redis, e você pode solicitar que o Redis GET, SET ou incremente atomicamente campos individuais de maneira muito rápida.

Hashes também podem ser usados ​​para representar estruturas de dados vinculadas, usando referências. Por exemplo, verifique a implementação dos comentários do lamernews.com.

Conjuntos classificados


Conjuntos ordenados são as únicas outras estruturas de dados, além de listas, para manter elementos ordenados . Você pode fazer várias coisas legais com conjuntos ordenados. Por exemplo, você pode ter todos os tipos de Top Top listas em seu aplicativo da web. Principais usuários por pontuação, principais postagens por visualizações de página, top o que for, mas uma única instância do Redis suportará toneladas de operações de inserção e obtenção de elementos por segundo.

Conjuntos ordenados, como conjuntos regulares, podem ser usados ​​para descrever relações, mas também permitem paginar a lista de itens e lembrar a ordenação. Por exemplo, se eu me lembrar dos amigos do usuário X com um conjunto classificado, posso me lembrar facilmente deles na ordem de amizade aceita.

Conjuntos ordenados são bons para filas de prioridade.

Conjuntos ordenados são como listas mais poderosas onde inserir, remover ou obter intervalos do meio da lista é sempre rápido. Mas eles usam mais memória e são estruturas de dados O(log(N)).

Conclusão


Espero ter fornecido algumas informações neste post, mas é muito melhor baixar o código-fonte do lamernews de http://github.com/antirez/lamernews e entender como ele funciona. Muitas estruturas de dados do Redis são usadas dentro do Lamer News, e há muitas pistas sobre o que usar para resolver uma determinada tarefa.

Desculpem os erros gramaticais, é meia-noite aqui e estou cansado demais para revisar o post;)