31 perguntas mais comuns da entrevista do Redis

Artigo Diretório

O que é Redis?

O nome completo do redis: Servidor de dicionário remoto.

O Redis é essencialmente um banco de dados na memória do tipo valor-chave, muito parecido com memcached. O banco de dados inteiro é carregado na memória para operação e os dados do banco de dados são descarregados no disco rígido para armazenamento periodicamente por meio de operações assíncronas.

Por ser uma operação de memória pura, o Redis tem um desempenho excelente. Pode lidar com mais de 100.000 operações de leitura e gravação por segundo. É o banco de dados de valor-chave mais rápido conhecido. A velocidade de leitura é 110000 vezes / s, e a velocidade de gravação é 81000 vezes / s

A excelência do Redis não é apenas desempenho. O maior charme do Redis é que ele suporta o armazenamento de várias estruturas de dados. Além disso, o limite máximo de um único valor é 512 MB, ao contrário do memcached que pode armazenar apenas 1 MB de dados.

Portanto, o Redis pode ser usado para implementar muitas funções úteis, como usar sua Lista como uma lista FIFO duplamente vinculada, implementar um serviço de fila de mensagens leve de alto desempenho e usar seu Conjunto como um sistema de tag de alto desempenho. Além disso, o Redis também pode definir o tempo de expiração do valor-chave armazenado, para que também possa ser usado como uma versão aprimorada do memcached.

A principal desvantagem do Redis é que a capacidade do banco de dados é limitada pela memória física e não pode ser usada para leitura e gravação de alto desempenho de dados massivos. Portanto, os cenários adequados para o Redis são limitados principalmente a operações de alto desempenho e cálculos com uma pequena quantidade de dados.

Quais são as vantagens do Redis?

  • Desempenho muito alto - o Redis pode ler 110.000 vezes / s e gravar 81.000 vezes / s.
  • Tipos de dados ricos - o Redis oferece suporte aos tipos de dados String, List, Hash, Set e Sorted Set.
  • Segurança de thread - todas as operações do Redis são atômicas, o que significa que elas têm sucesso ou falham. Uma única operação é atômica. Operações múltiplas também suportam transações, ou seja, atomicidade, empacotadas por instruções MULTI e EXEC.
  • Recursos avançados - o Redis também oferece suporte para publicação / assinatura, notificação, expiração de chave e outros recursos.

Quais são os cenários adequados para o Redis?

  1. Compartilhamento de sessão (logon único)
  2. Cache de página
  3. fila
  4. Tabela de classificação / contador
  5. Publicar / assinar

Por que o Redis é de thread único

O FAQ oficial declarou que, como o Redis é uma operação baseada em memória, a CPU não é o gargalo do Redis. O gargalo do Redis é provavelmente o tamanho da memória da máquina ou largura de banda da rede. Como o single-threading é fácil de implementar e a CPU não se tornará um gargalo, é lógico adotar uma solução de single-threaded (afinal, o multithreading será um grande problema!) O Redis usa a tecnologia de fila para transformar o acesso simultâneo em acesso serial.

O único encadeamento que enfatizamos aqui é que há apenas um encadeamento para processar nossas solicitações de rede. Quando um servidor Redis formal está em execução, deve haver mais de um encadeamento. Aqui, precisamos prestar atenção nele claramente! Por exemplo, quando o Redis é persistido, ele será executado em um subprocesso ou subencadeamento.

Por que o Redis de thread único é tão rápido

  1. Operações de memória pura: a maioria das solicitações são operações de memória pura, que são muito rápidas. Os dados são armazenados na memória, semelhante ao HashMap. A vantagem do HashMap é que a complexidade do tempo de pesquisa e operação é O (1);
  2. A estrutura de dados é simples e a manipulação de dados também é simples.
  3. A operação de thread único evita a troca desnecessária de contexto e condições de corrida. Não há troca causada por vários processos ou threads para consumir CPU. Não há necessidade de considerar vários problemas de bloqueio. Não há operação de liberação de bloqueio e não há possibilidade Consumo de desempenho causado por conflito.
  4. Um mecanismo de multiplexação de E / S sem bloqueio multiplex é adotado, onde "múltiplo" se refere a várias conexões de rede e "multiplex" se refere à multiplexação do mesmo encadeamento

Por que o redis precisa colocar todos os dados na memória?

Para alcançar a velocidade de leitura e gravação mais rápida, o Redis lê todos os dados na memória e os grava no disco de maneira assíncrona. Portanto, o redis possui as características de rapidez e persistência de dados. Se você não colocar os dados na memória, a velocidade de E / S do disco afetará seriamente o desempenho do redis. Hoje, quando a memória está ficando mais barata, o redis se tornará cada vez mais popular.

Quais são as diferenças entre Memcache e Redis?

  1. redis suporta persistência

O Memcache não tem um mecanismo de persistência, portanto, todos os dados em cache são inválidos quando ficam inativos.

O Redis oferece suporte à persistência de dados, o que pode manter os dados na memória do disco e pode ser carregado novamente para uso ao reiniciar, e tem um mecanismo de recuperação de desastres melhor.

  1. O Redis oferece suporte a mais tipos de dados:

O Memcache oferece suporte apenas a tipos de dados simples e exige que o cliente lide com objetos complexos sozinho. O Redis não oferece suporte apenas a dados do tipo k / v simples, mas também fornece armazenamento para list, set, zset, hash e outras estruturas de dados.

  1. Use diferentes modelos subjacentes

A implementação subjacente entre eles e o protocolo do aplicativo para comunicação com o cliente são diferentes. O Redis construiu diretamente o próprio mecanismo da VM, porque o sistema geral chama funções do sistema, ele vai perder um certo tempo para mover e solicitar.

Tipos de dados do Redis e cenários de uso de cada tipo de dados

Existem cinco tipos de dados: string, hash, lista, conjunto, conjunto classificado.

  1. Corda

Para as operações set / get mais convencionais, o valor pode ser uma String ou um número. Geralmente é usado para armazenar em cache strings comumente usadas ou algumas funções de contagem complexas.

  1. Cerquilha

O valor armazenado aqui é um objeto estruturado e é mais conveniente manipular um dos campos. Geralmente usado para armazenar um objeto em cache.

  1. Lista

Usando a estrutura de dados de List, você pode executar uma função simples de fila de mensagens. Além disso, você pode usar o comando lrange para fazer a função de paginação baseada em redis, que tem excelente desempenho e boa experiência do usuário.

  1. conjunto

Porque set é uma coleção de valores únicos. Portanto, você pode fazer a função de eliminação de duplicação global. Além disso, usando operações como interseção, união e diferença, você pode calcular preferências comuns, todas as preferências e suas próprias preferências exclusivas.

  1. conjunto classificado

O conjunto classificado tem mais uma pontuação de parâmetro de peso e os elementos do conjunto podem ser organizados de acordo com a pontuação. Ele pode ser usado como um aplicativo de tabela de classificação para realizar as operações TOP N.

Qual é a capacidade máxima que um valor de string pode armazenar?

512M

Estratégia de expiração e estratégia de eliminação de memória do Redis

Redis usa uma estratégia de exclusão regular + exclusão lenta

Por que o redis não precisa ser excluído regularmente?

A exclusão cronometrada refere-se ao uso de um cronômetro para monitorar a chave e será excluída automaticamente quando expirar. Embora a memória seja liberada com o tempo, ela consome muito os recursos da CPU. No caso de grandes solicitações simultâneas, a CPU usará tempo para processar a solicitação em vez de excluir a chave, portanto, essa estratégia não é adotada.

Como funciona a exclusão regular + exclusão preguiçosa?

Exclua periodicamente, o redis verifica a cada 100 ms por padrão para ver se há uma chave expirada e, se houver uma chave expirada, exclua-a. Deve-se observar que o redis não verifica todas as chaves uma vez a cada 100 ms, mas as seleciona aleatoriamente para inspeção (se a cada 100 ms, todas as chaves são verificadas, o redis não é travado). Portanto, se apenas a estratégia de exclusão regular for adotada, muitas chaves não serão excluídas a tempo.
Portanto, a exclusão preguiçosa é útil. Em outras palavras, ao obter uma chave, o redis irá verificar se a chave está configurada com um tempo de validade, ela expira? Se ele expirar, ele será excluído.

Existe algum outro problema com a exclusão regular + exclusão lenta?

Não, se você excluir a chave regularmente, a chave não será excluída. Então você não solicitou a chave a tempo, o que significa que a exclusão lenta não teve efeito. Desta forma, a memória do redis ficará cada vez mais alta e, eventualmente, a memória pode ficar cheia e o serviço travar. Nesse momento, o mecanismo de eliminação de memória deve ser adotado.

Existe uma linha de configuração em redis.conf para configurar a estratégia de eliminação de memória:

maxmemory-policy volatile-lru

Existem 6 estratégias de eliminação de memória:

  • no-eviction: os pedidos de escrita não continuarão a ser servidos (os pedidos DEL podem continuar a ser servidos), os pedidos de leitura podem continuar. Isso pode garantir que os dados não sejam perdidos, mas tornará os negócios online insustentáveis. Esta é a estratégia de eliminação padrão.
  • Volatile-lru: Tente eliminar a chave com um tempo de expiração, e a chave menos usada será eliminada primeiro. Chaves que não têm um tempo de expiração não serão eliminadas, o que garante que os dados que precisam ser persistidos não sejam perdidos repentinamente. (Este é o mais usado)
  • volatile-ttl: O mesmo que acima, exceto que a estratégia de eliminação não é LRU, mas o valor da vida restante ttl da chave. Quanto menor o ttl, mais prioridade ele será eliminado, ou seja, os dados que irão expirar.
  • volatile-random: selecione aleatoriamente os dados a serem eliminados do conjunto de dados (server.db [i] .expires) com um conjunto de tempo de expiração
  • allkeys-lru: diferente de volatile-lru, o objeto-chave a ser eliminado por esta estratégia é o conjunto de chaves inteiro, não apenas o conjunto de chaves expiradas. Isso significa que as chaves sem tempo de expiração também serão eliminadas.
  • allkeys-random: selecionar dados arbitrariamente de todo o conjunto de chaves (server.db [i] .dict) para eliminar

Se a chave não definir o tempo de expiração, o comportamento de volatile-lru, volatile-ttl, volatile-random é semelhante a não-eviction

Existem dados de 2.000 watts no MySQL e apenas dados de 20 watts no redis. Como garantir que os dados no redis sejam todos dados ativos?

Quando o tamanho do conjunto de dados da memória do redis aumenta para um determinado tamanho, a estratégia de eliminação de dados é implementada.

Suponha que haja 100 milhões de chaves no Redis e 10w delas comecem com um prefixo fixo conhecido. E se você puder encontrar todas elas?

Use o comando keys para examinar a lista de chaves do modo especificado.

A outra parte então perguntou: Se este redis está fornecendo serviços para negócios online, que problemas haverá com o uso do comando keys?

Neste momento, você deve responder a um dos principais recursos do redis: o single-threaded do redis. A instrução keys fará com que o thread seja bloqueado por um período de tempo, e o serviço online será pausado.O serviço não pode ser restaurado até que a instrução seja executada. Neste momento, você pode usar o comando scan. O comando scan pode extrair a lista de chaves do modo especificado sem bloquear, mas haverá uma certa probabilidade de repetição. É suficiente fazer uma desduplicação no lado do cliente, mas o tempo geral será mais do que uso direto A instrução das chaves é longa.

Você usou o Redis como uma fila assíncrona? Como você o usa?

Geralmente, a estrutura da lista é usada como uma fila, rpush produz mensagens e lpop consome mensagens. Quando não houver mensagem do lpop, você deve dormir um pouco e tentar novamente.

Se a outra parte perguntar, não consigo dormir?

A lista também possui um comando chamado blpop, quando não houver mensagem, ela será bloqueada até que a mensagem chegue.

Se a outra parte perguntar se pode produzir uma vez e consumir várias vezes?

Usando o modo de assinante de tópico pub / sub, uma fila de mensagens 1: N pode ser realizada.

Se a outra parte perguntar quais são as desvantagens do pub / sub?

Quando o consumidor fica offline, a mensagem produzida será perdida.Neste caso, deve ser utilizada uma fila de mensagens profissional como RabbitMQ.

Se a outra parte perguntar como o redis implementa a fila de espera?

Use sortedset, use o timestamp como a pontuação e o conteúdo da mensagem como a chave para chamar zadd para produzir a mensagem.Os consumidores usam o comando zrangebyscore para obter a pesquisa de dados N segundos antes do processamento.

Mecanismo de persistência do Redis

O Redis é um banco de dados na memória que suporta persistência.Os dados na memória são sincronizados com os arquivos do disco rígido por meio de um mecanismo de persistência para garantir a persistência dos dados. Quando o Redis é reiniciado, recarregando o arquivo do disco rígido na memória, o objetivo da recuperação de dados pode ser alcançado.

Mecanismo de implementação: crie fork () um processo filho separadamente, copie os dados do banco de dados do processo pai atual para a memória do processo filho e, em seguida, grave-o em um arquivo temporário pelo processo filho, o processo de persistência termina e, em seguida, substitua-o por este arquivo temporário O último arquivo de instantâneo, o processo filho sai e a memória é liberada.

Dois mecanismos de persistência: RDB e AOF.

RDB: método de persistência padrão do Redis. De acordo com uma determinada estratégia de período de tempo, os dados da memória são salvos no arquivo binário do disco rígido na forma de instantâneo. Ou seja, armazenamento de instantâneo de instantâneo, o arquivo de dados correspondente é dump.rdb e o ciclo de instantâneo é definido pelo parâmetro salvar no arquivo de configuração.

AOF: o Redis anexará cada comando de gravação recebido ao final do arquivo por meio da função Write, semelhante ao log bin do MySQL. Quando o Redis for reiniciado, ele executará novamente o comando de gravação salvo no arquivo para reconstruir o conteúdo de todo o banco de dados na memória.

Vantagens e desvantagens de RDB e AOF

Resistência RDB

Vantagens: os arquivos RDB são compactos, pequenos em tamanho, rápidos na transmissão pela rede, adequados para cópia completa; a velocidade de recuperação é muito mais rápida do que AOF. Claro, em comparação com AOF, uma das vantagens mais importantes do RDB é que ele tem um impacto relativamente pequeno no desempenho.

Desvantagens: a desvantagem fatal dos arquivos RDB é que a persistência dos instantâneos de dados determina que a persistência em tempo real não pode ser alcançada. Hoje, quando os dados se tornam cada vez mais importantes, uma grande quantidade de perda de dados costuma ser inaceitável, portanto, persistência AOF Torne-se o mainstream. Além disso, os arquivos RDB precisam atender a um formato específico e têm baixa compatibilidade (por exemplo, a versão antiga do Redis não é compatível com a nova versão dos arquivos RDB).

Persistência AOF

A vantagem do AOF é que ele oferece suporte à persistência de segundo nível e boa compatibilidade.

As desvantagens são arquivos grandes, velocidade de recuperação lenta e grande impacto no desempenho.

Como entender a transação do Redis?

A transação é uma operação isolada separada: todos os comandos na transação são serializados e executados sequencialmente. Durante a execução da transação, ela não será interrompida por solicitações de comando enviadas por outros clientes.

Uma transação é uma operação atômica: ou todos os comandos na transação são executados ou nenhum deles é executado.

Mas o redis não fornece transações estritas. O Redis apenas garante a execução serial dos comandos e garante toda a execução. No entanto, quando a execução do comando falha, ele não retrocede, mas continua a ser executado.

Quais são os comandos relacionados às transações do Redis?

MULTI 、 EXEC 、 DISCARD 、 WATCH

Quais são os clientes Java suportados pelo Redis? Qual é a recomendação oficial?

Redisson, Jedis, alface, etc. A recomendação oficial é usar Redisson.

Qual é a relação entre Redis e Redisson?

Redisson é um terminal de atendimento ao cliente Redis distribuído e coordenado avançado, que pode ajudar os usuários a implementar facilmente alguns objetos Java (filtro Bloom, BitSet, Set, SetMultimap, ScoredSortedSet, SortedSet, Map, ConcurrentMap, List, ListMultimap, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, ReadWriteLock, AtomicLong, CountDownLatch, Publicar / Assinar, HyperLogLog).

Quais são as vantagens e desvantagens dos Jedis e Redisson?

Jedis é um cliente da implementação Java do Redis e sua API fornece suporte abrangente aos comandos do Redis;

Redisson implementa uma estrutura de dados Java distribuída e escalonável. Comparado com Jedis, tem funções mais simples. Não oferece suporte a operações de string e não oferece suporte a recursos do Redis, como classificação, transações, canais e partições. O objetivo do Redisson é promover a separação das preocupações dos usuários para o Redis, para que os usuários possam se concentrar mais no processamento da lógica de negócios.

Fale sobre o conceito de slot hash Redis?

O cluster Redis não usa hash consistente, mas introduz o conceito de slot de hash. O cluster Redis tem 16384 slots de hash. Após a verificação do CRC16, cada chave é o módulo 16384 para decidir qual slot deve ser colocado. Cada nó do cluster Responsável por parte do slot hash.

Sob quais circunstâncias a solução de cluster Redis fará com que todo o cluster fique indisponível?

Em um cluster com três nós A, B e C, sem um modelo de replicação, se o nó B falhar, todo o cluster pensará que falta slots na faixa de 5501-11000 e não está disponível.

Você já usou o cluster Redis, qual é o princípio do cluster?

  1. O Redis Sentinal foca na alta disponibilidade. Quando o master estiver inativo, ele irá automaticamente promovê-lo ao master e continuar a fornecer serviços.
  2. O Redis Cluster se concentra na escalabilidade. Quando uma única memória do Redis é insuficiente, o Cluster é usado para armazenamento de shard.

O que a solução de cluster redis deve fazer? Quais são as opções?

  1. twemproxy

O conceito geral é que ele é semelhante a um método de proxy e o método de uso não é diferente do redis comum. Depois de configurar várias instâncias do redis nele, ao usá-lo, conecte-se ao twemproxy onde precisa se conectar ao redis, e ele usará um proxy A identidade recebe a solicitação e usa o algoritmo hash consistente para transferir a solicitação para o redis específico e, em seguida, retornar o resultado para twemproxy. Fácil de usar (em relação ao redis basta modificar a porta de conexão), a primeira opção para a expansão de projetos antigos. Problema: a pressão da própria instância de porta única do twemproxy, após usar hashing consistente, altera o valor calculado quando o número de nós do redis muda e os dados não podem ser movidos automaticamente para o novo nó.

  1. códigos

O esquema de agrupamento mais comumente usado atualmente tem o mesmo efeito que twemproxy, mas suporta a restauração dos dados do nó antigo para o novo nó hash quando o número de nós muda.

  1. redis cluster3.0

O próprio cluster do Redis é caracterizado pelo fato de que seu algoritmo distribuído não é um hash consistente, mas o conceito de um slot de hash e seu próprio suporte para a configuração de nós escravos.

  1. Implementado na camada de código de negócios

Inicie algumas instâncias de redis não relacionadas, na camada de código, execute operações hash nas chaves e vá para as instâncias de redis correspondentes para manipular os dados.

Qual é o número máximo de nós em um cluster Redis?

16.384.

Como escolher um banco de dados para cluster Redis?

O cluster Redis atualmente não pode fazer a seleção do banco de dados, o padrão é 0 banco de dados.

Qual é o modelo de replicação mestre-escravo do cluster Redis?

Para tornar o cluster ainda disponível quando alguns nós falham ou a maioria dos nós não consegue se comunicar, o cluster usa um modelo de replicação mestre-escravo e cada nó tem N-1 réplicas.

As operações de gravação serão perdidas no cluster Redis? porque?

O Redis não garante forte consistência de dados, o que significa que, na prática, o cluster pode perder operações de gravação sob certas condições.

Como é a replicação entre clusters Redis?

Replicação assíncrona

Problemas e soluções comuns de desempenho do Redis

  1. É melhor não gravar instantâneos de memória para o Mestre. Se o Mestre gravar instantâneos de memória e o comando salvar agendar a função rdbSave, ele bloqueará o trabalho do thread principal. Quando o instantâneo for grande, o impacto no desempenho será muito grande e o serviço será suspenso intermitentemente.
  2. Se os dados forem mais importantes, um Slave ativa o AOF para fazer backup dos dados e a política é definida para sincronizar uma vez por segundo.
  3. Para a velocidade de replicação mestre-escravo e a estabilidade da conexão, é melhor que Mestre e Escravo estejam na mesma LAN.
  4. Tente evitar adicionar bibliotecas escravas à biblioteca mestre estressante.
  5. Não use uma estrutura de gráfico para replicação mestre-escravo. É mais estável usar uma estrutura de lista unida individualmente, ou seja: Master <- Slave1 <- Slave2 <- Slave3 ... Esta estrutura é conveniente para resolver o problema de falha de ponto único e realizar a substituição de Slave para Master. Se o mestre estiver desligado, você pode iniciar imediatamente o Slave1 como o mestre e os outros permanecerão inalterados.

Como o Redis otimiza a memória?

Use tabelas hash (hashes) tanto quanto possível. A memória usada pelas tabelas hash (o que significa que o número armazenado na tabela hash é pequeno) é muito pequeno, então você deve abstrair seu modelo de dados em uma tabela hash o máximo possível.

Por exemplo, se você tiver um objeto de usuário em seu sistema da web, não defina uma chave separada para o nome, sobrenome, endereço de e-mail e senha do usuário, mas armazene todas as informações do usuário em uma tabela hash.

Acho que você gosta

Origin blog.csdn.net/kaihuishang666/article/details/104430833
Recomendado
Clasificación