Portanto, cheguei a um local em que queria segmentar os dados que armazeno em redis em bancos de dados separados, pois às vezes preciso usar o comando keys em um tipo específico de dados e queria separá-los para torná-lo mais rápido .
Se eu segmentar em vários bancos de dados, tudo ainda será encadeado e ainda utilizarei apenas um núcleo. Se eu simplesmente lançar outra instância do Redis na mesma caixa, utilizarei um núcleo extra. Além disso, não posso nomear bancos de dados Redis ou fornecer a eles qualquer tipo de identificador mais lógico. Então, com tudo isso dito, por que / quando eu iria querer usar vários bancos de dados Redis em vez de apenas criar uma instância extra do Redis para cada banco de dados extra que eu quiser? E, relacionado, por que o Redis não tenta utilizar um núcleo extra para cada banco de dados extra adicionado? Qual é a vantagem de ser único encadeado nos bancos de dados?
Respostas:
Principalmente, os bancos de dados Redis na mesma instância não são diferentes dos esquemas nas instâncias do banco de dados RDBMS.
Há uma clara vantagem de usar bancos de dados redis na mesma instância redis, e isso é gerenciamento. Se você criar uma instância separada para cada aplicativo e digamos que você tem 3 aplicativos, são 3 instâncias redis separadas, cada uma das quais provavelmente precisará de um escravo para HA na produção, totalizando 6 instâncias. Do ponto de vista do gerenciamento, isso fica confuso muito rápido, porque você precisa monitorar todos eles, fazer atualizações / correções, etc. Se você não planeja sobrecarregar redis com E / S alta, uma única instância com um escravo é mais simples e mais fácil de gerenciar, desde que atenda ao seu SLA.
fonte
Você não deseja usar vários bancos de dados em uma única instância de redis. Ele foi descontinuado e, como você observou, várias instâncias permitem tirar proveito de vários núcleos. Se você usar a seleção de banco de dados, precisará refatorar ao atualizar. Monitorar e gerenciar várias instâncias não é difícil nem doloroso.
De fato, você obteria métricas muito melhores em cada banco de dados por segregação com base em instância. Cada instância teria estatísticas que refletem esse segmento de dados, o que pode permitir melhor ajuste e monitoramento mais responsivo e preciso. Use uma versão recente e separe seus dados por instância.
Como Jonaton disse, não use o comando keys. Você encontrará desempenho muito melhor se simplesmente criar um índice de chave. Sempre que adicionar uma chave, adicione o nome da chave a um conjunto. O comando keys não é muito útil quando você aumenta a escala, pois levará um tempo significativo para retornar.
Deixe o padrão de acesso determinar como estruturar seus dados, em vez de armazená-los da maneira que você acha que funciona e, em seguida, contornar como acessá-los e medi-los posteriormente. Você verá um desempenho muito melhor e descobrirá que o código que consome dados geralmente é muito mais limpo e simples.
Em relação ao encadeamento único, considere que o redis foi projetado para velocidade e atomicidade. As ações de modificação de dados em um banco de dados não precisam esperar em outro banco de dados, mas e se essa ação estiver salvando no arquivo de despejo ou processando transações em escravos? Nesse ponto, você começa a se interessar pela programação simultânea.
Ao usar várias instâncias, você transforma a complexidade de multiencadeamento em um sistema de estilo de passagem de mensagens mais simples.
fonte
Até Salvatore Sanfilippo (criador do Redis) acha que é uma má idéia usar vários bancos de dados no Redis. Veja o comentário dele aqui:
https://groups.google.com/d/topic/redis-db/vS5wX8X4Cjg/discussion
fonte
Realmente não conheço nenhum benefício de ter vários bancos de dados em uma única instância. Eu acho que é útil se vários serviços usarem os mesmos servidores de banco de dados, para evitar colisões de chaves.
Eu não recomendaria criar usando o
KEYS
comando, pois é O (n) e isso não é escalável. O que você está usando para realizar de outra maneira? Talvez redis não seja a melhor opção para você, se a funcionalidadeKEYS
for vital.Eu acho que eles mencionam os benefícios de um único servidor encadeado nas perguntas frequentes, mas o principal é a simplicidade - você não precisa se preocupar com a concorrência de maneira real. Toda ação está bloqueando, portanto, duas coisas não podem alterar o banco de dados ao mesmo tempo. Idealmente, você teria uma (ou mais) instâncias por núcleo de cada servidor e usaria um algoritmo de hash consistente (ou um proxy) para dividir as chaves entre elas. Obviamente, você perderá algumas funcionalidades - a tubulação funcionará apenas para coisas no mesmo servidor, as classificações se tornam mais difíceis etc.
fonte
Estou usando o redis para implementar uma lista negra de endereços de e-mail e tenho valores TTL diferentes para diferentes níveis de lista negra, portanto, ter bancos de dados diferentes na mesma instância me ajuda muito.
fonte
Os bancos de dados Redis podem ser usados nos raros casos de implantação de uma nova versão do aplicativo, em que a nova versão requer trabalho com diferentes entidades.
fonte
O uso de vários bancos de dados em uma única instância pode ser útil no seguinte cenário:
Cópias diferentes do mesmo banco de dados podem ser usadas para produção, desenvolvimento ou teste usando dados em tempo real. As pessoas podem usar réplica para clonar uma instância redis para atingir o mesmo objetivo. No entanto, a abordagem anterior é mais fácil para os programas em execução existentes selecionarem o banco de dados correto para alternar para o modo pretendido.
fonte
Sei que essa pergunta tem anos, mas há outra razão pela qual vários bancos de dados podem ser úteis.
Se você usar um "Redis em nuvem" do seu provedor de nuvem favorito, provavelmente terá um tamanho mínimo de memória e pagará pelo que alocar. Se, no entanto, seu conjunto de dados for menor que isso, você estará desperdiçando um pouco da alocação e, assim, desperdiçando um pouco de dinheiro.
Usando bancos de dados, você pode usar a mesma instância de nuvem Redis para fornecer serviço para (digamos) desenvolvedor, UAT e produção, ou várias instâncias de seu aplicativo ou qualquer outra coisa - usando mais memória alocada e, portanto, um pouco mais de custo. eficaz.
Um caso de uso que estou analisando tem várias instâncias de um aplicativo que usam 200 a 300 K cada, mas a alocação mínima no meu provedor de nuvem é de 1 milhão. Podemos consolidar 10 instâncias em um único Redis sem realmente prejudicar quaisquer limites e, assim, economizar cerca de 90% do custo de hospedagem Redis. Compreendo que existem limitações e problemas com essa abordagem, mas achei que vale a pena mencionar.
fonte