Redis
 sql >> Database >  >> NoSQL >> Redis

Come inserire miliardi di dati in Redis in modo efficiente?

Alcuni punti riguardanti la domanda e il codice di esempio.

  1. Il pipelining non è un proiettile d'argento:devi capire cosa fa prima di usarlo. Ciò che fa il pipelining è raggruppare in batch diverse operazioni inviate in blocco, così come la loro risposta dal server. Quello che ottieni è che il tempo di andata e ritorno della rete per ogni operazione viene sostituito da quello del batch. Ma i lotti di dimensioni infinite sono un vero e proprio consumo di risorse:è necessario mantenere le loro dimensioni sufficientemente piccole per essere efficaci. Come regola generale, di solito cerco di puntare a 60 KB per pipeline e poiché ogni dato è diverso, lo stesso vale per il numero di operazioni effettive in una pipeline. Supponendo che la tua chiave e il suo valore siano ~1KB, devi chiamare pipeline.execute() ogni 60 operazioni circa.

  2. A meno che io non fraintenda grossolanamente, questo codice non dovrebbe essere eseguito. Stai usando HMSET come se fosse SET , quindi in pratica ti manca il campo->mappatura del valore di Hash. Hash (HMSET ) e stringhe (SET ) sono tipi di dati diversi e dovrebbero pertanto essere utilizzati di conseguenza.

  3. Sembra che questo piccolo ciclo sia responsabile dell'intero "miliardo di dati" - in tal caso, non solo il tuo server che esegue il codice si scambierebbe come un matto a meno che non abbia molta RAM per contenere il dizionario, sarebbe anche molto inefficace (indipendentemente dalla velocità di Python). È necessario parallelizzare l'inserimento dei dati eseguendo più istanze di questo processo.

  4. Ti stai connettendo a Redis da remoto? In tal caso, la rete potrebbe limitare le tue prestazioni.

  5. Considera le impostazioni del tuo Redis:forse queste possono essere ottimizzate/regolate per prestazioni migliori per questa attività, supponendo che si tratti effettivamente di un collo di bottiglia.