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

Pipelining vs batch in Stackexchange.Redis

Dietro le quinte, SE.Redis fa un bel po' di lavoro per cercare di evitare la frammentazione dei pacchetti, quindi non sorprende che sia abbastanza simile nel tuo caso. Le principali differenze tra batching e flat pipelining sono:

  • un batch non sarà mai intercalato con operazioni concorrenti sullo stesso multiplexer (sebbene possa essere interleaved sul server; per evitare che sia necessario utilizzare un multi /exec transazione o uno script Lua)
  • un batch eviterà sempre la possibilità di pacchetti sottodimensionati, perché conosce tutti i dati in anticipo
  • ma allo stesso tempo, l'intero batch deve essere completato prima di poter inviare qualsiasi cosa, quindi ciò richiede più buffering in memoria e può introdurre artificialmente latenza

Nella maggior parte dei casi, farai meglio evitando il batching, poiché SE.Redis ottiene la maggior parte di ciò che fa automaticamente quando si aggiunge semplicemente del lavoro.

Come nota finale; se vuoi evitare un sovraccarico locale, un approccio finale potrebbe essere:

redisDB.SetAdd(string.Format(keyFormat, row.Field<int>("Id")),
    row.Field<int>("Value"), flags: CommandFlags.FireAndForget);

Questo manda tutto via, senza aspettare risposte né allocare Task incompleto s per rappresentare i valori futuri. Potresti voler fare qualcosa come un Ping alla fine senza fire-and-forget, per verificare che il server stia ancora parlando con te. Tieni presente che l'utilizzo di fire-and-forget significa che non noterai alcun errore del server segnalato.