Qual é o objetivo de vários bancos de dados Redis?

159

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?

Eli
fonte
no aplicativo Node.js, faça isso ---> module.exports = {"1": "seu nome para redis db one", "2": "seu nome para redis db dois", "3": "seu nome para Redis db três "} etc, ou mudar as chaves e valores, o que você precisa
Alexander Mills
1
No Redis 2.8.0 e superior, é recomendável usar SCAN em vez de KEYS, porque itera sobre um pequeno número de elementos de cada vez (portanto, não bloqueia o servidor por longos períodos de tempo).
TryHarder 16/09

Respostas:

85

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.

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?

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.

rafiano
fonte
25
Várias instâncias do Redis são sempre o caminho a percorrer. Período. Execute consultas paralelas para dados diferentes. Se o seu pipeline do CICD não criar clusters de cache para você, corrija-o, em vez de ..... Você entendeu o ponto #
Cmag
3
Isso não aborda os pontos do OP: (1) por que o Redis não tenta utilizar um núcleo extra para cada banco de dados extra? (2) Qual é a vantagem de ser único encadeado nos bancos de dados?
Ives
93

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.

The Real Bill
fonte
57
O uso de vários bancos de dados foi preterido? Você pode fornecer uma referência para essa declaração, por favor. Estou ciente de que vários bancos de dados não são suportados no Redis Cluster, mas também não existem comandos complexos de várias chaves e não foram preteridos.
Ostergaard 19/10/2013
27
Algumas evidências (fortes) do 'proprietário' da Redis (de acordo com o Google Code) de que "... os bancos de dados não serão depreciados, mesmo que eu tenha declarado anteriormente que seria".
precisa saber é o seguinte
3
Você não poderá usar mais de um redis db no redis-cluster. Além disso, vários bancos de dados ainda serão importantes.
coredump
26
-1 para a instrução preterida. Vários bancos de dados podem ser desencorajados e não suportados no redis-cluster, mas não são preteridos.
AgDude
1
@ the-real-bill Como você pode "criar um índice de chave"?
Kees de Kooter 04/12
57

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

Entendo como isso pode ser útil, mas, infelizmente, considero os erros múltiplos do banco de dados Redis minha pior decisão no design do Redis ... sem nenhum tipo de ganho real, torna os internos muito mais complexos. A realidade é que os bancos de dados não escalam bem por vários motivos, como expirar ativo de chaves e VM. Se a seleção do banco de dados puder ser executada com uma string, posso ver esse recurso sendo usado como uma camada de dicionário O (1) escalável, que não é.

Com números de banco de dados, com um padrão de poucos bancos de dados, estamos melhor comunicando o que é esse recurso e como posso ser usado, eu acho. Espero que, em algum momento, possamos descartar o suporte a vários bancos de dados, mas acho que provavelmente é tarde demais, pois há várias pessoas que dependem desse recurso para o seu trabalho.

Nirmal
fonte
4
Espere, então usar a seleção de banco de dados é menos eficiente do que usar um prefixo? É isso o que esta frase significa aqui (alguém poderia esclarecer)? "Se a seleção do banco de dados puder ser executada com uma string, posso ver esse recurso sendo usado como uma camada de dicionário O (1) escalável, que, em vez disso, não é."
dvtan
8
  1. 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.

  2. Eu não recomendaria criar usando o KEYScomando, 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 funcionalidade KEYSfor vital.

  3. 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.

Jonatan Hedborg
fonte
Em resposta ao 2: eu uso o comando keys somente quando preciso de todas as chaves. Eu o uso da mesma maneira que alguém usaria o hgetall. Ambos são O (n). Chaves é ruim se você precisar pesquisar um conjunto enorme de chaves em busca de alguma regex, mas tudo bem se você precisar executar alguma operação em todas as chaves em algum banco de dados. Em resposta a 3: eu entendo os benefícios da segmentação única em um banco de dados. Não o entendo em muitos bancos de dados, pois uma ação em um banco de dados nunca precisa bloquear uma ação em outro banco de dados AFAIK.
Eli
3

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.

kommradHomer
fonte
1
Agora, estamos enfrentando o mesmo problema - queremos definir políticas diferentes de LRU para diferentes partes de nossos dados. você pode compartilhar como você implementou isso?
user2717436
@ user2717436 Não sei se o que faço está relacionado ao seu, mas utilizo bancos de dados diferentes como conjuntos diferentes, sempre definindo o TTL das chaves ao inseri-las. como existe a lista negra A no redis.get (1), e sempre que eu definir uma chave lá, eu defino o vencimento para 5000. e não há lista negra B em redis.get (2) e sempre que eu definir uma chave de lá, eu definir expirar para 10000
kommradHomer
2

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.

Shlomi
fonte
1

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.

yoonghm
fonte
1

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.

Ralph Bolton
fonte