Redis
 sql >> Base de données >  >> NoSQL >> Redis

Comment insérer efficacement des milliards de données dans Redis ?

Quelques points concernant la question et l'exemple de code.

  1. Le pipelining n'est pas une solution miracle - vous devez comprendre ce qu'il fait avant de l'utiliser. Ce que fait le pipelining, c'est regrouper plusieurs opérations qui sont envoyées en bloc, tout comme leur réponse du serveur. Ce que vous gagnez, c'est que le temps d'aller-retour réseau pour chaque opération est remplacé par celui du lot. Mais les lots de taille infinie sont une véritable ponction sur les ressources - vous devez garder leur taille suffisamment petite pour être efficace. En règle générale, j'essaie généralement de viser 60 Ko par pipeline et, comme chaque donnée est différente, il en va de même pour le nombre d'opérations réelles dans un pipeline. En supposant que votre clé et sa valeur sont d'environ 1 Ko, vous devez appeler pipeline.execute() toutes les 60 opérations environ.

  2. Sauf erreur grossière de ma part, ce code ne devrait pas s'exécuter. Vous utilisez HMSET comme si c'était SET , il vous manque donc essentiellement le mappage champ-> valeur des hachages. Hachages (HMSET ) et Chaînes (SET ) sont des types de données différents et doivent donc être utilisés en conséquence.

  3. Il semble que cette petite boucle soit en charge de l'ensemble du "milliard de données" - si tel est le cas, non seulement votre serveur exécutant le code s'échangerait comme un fou à moins qu'il n'ait beaucoup de RAM pour contenir le dictionnaire, ce serait également très inefficace (quelle que soit la vitesse de Python). Vous devez paralléliser l'insertion de données en exécutant plusieurs instances de ce processus.

  4. Vous connectez-vous à Redis à distance ? Si c'est le cas, le réseau peut limiter vos performances.

  5. Considérez les paramètres de votre Redis - peut-être que ceux-ci peuvent être modifiés/réglés pour de meilleures performances pour cette tâche, en supposant qu'il s'agit bien d'un goulot d'étranglement.