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

Como inserir bilhões de dados no Redis com eficiência?


Alguns pontos sobre a pergunta e o código de exemplo.

  1. Pipelining não é uma bala de prata - você precisa entender o que ele faz antes de usá-lo. O que o pipelining faz é agrupar várias operações que são enviadas em massa, assim como a resposta do servidor. O que você ganha é que o tempo de ida e volta da rede para cada operação é substituído pelo do lote. Mas os lotes de tamanho infinito são um verdadeiro dreno de recursos - você precisa manter seu tamanho pequeno o suficiente para ser eficaz. Como regra geral, geralmente tento apontar para 60 KB por pipeline e, como todos os dados são diferentes, o mesmo acontece com o número de operações reais em um pipeline. Supondo que sua chave e seu valor sejam ~ 1 KB, você precisa chamar pipeline.execute() a cada 60 operações mais ou menos.

  2. A menos que eu entenda mal, esse código não deve ser executado. Você está usando HMSET como se fosse SET , então você está basicamente perdendo o mapeamento field->value de Hashes. Hashs (HMSET ) e Strings (SET ) são tipos de dados diferentes e, portanto, devem ser usados ​​de acordo.

  3. Parece que este pequeno loop é responsável por todo o "Billion of data" - se for esse o caso, não apenas o seu servidor executando o código estaria trocando como um louco, a menos que tenha muita RAM para armazenar o dicionário, também seria muito ineficaz (independentemente da velocidade do Python). Você precisa paralelizar a inserção de dados executando várias instâncias desse processo.

  4. Você está se conectando ao Redis remotamente? Nesse caso, a rede pode estar limitando seu desempenho.

  5. Considere as configurações do seu Redis - talvez elas possam ser ajustadas/ajustadas para melhor desempenho nessa tarefa, supondo que seja realmente um gargalo.