Nos bastidores, o SE.Redis faz um pouco de trabalho para tentar evitar a fragmentação de pacotes, então não é surpreendente que seja bastante semelhante no seu caso. A principal diferença entre batching e flat pipelining são:
- um lote nunca será intercalado com operações concorrentes no mesmo multiplexador (embora possa ser intercalado no servidor; para evitar isso, você precisa usar um
multi
/exec
transação ou um script Lua) - um lote sempre evitará a chance de pacotes subdimensionados, porque ele conhece todos os dados com antecedência
- mas, ao mesmo tempo, todo o lote deve ser concluído antes que qualquer coisa possa ser enviada, portanto, isso requer mais armazenamento em buffer na memória e pode introduzir latência artificialmente
Na maioria dos casos, você se sairá melhor evitando o batching, já que o SE.Redis alcança a maior parte do que faz automaticamente ao simplesmente adicionar trabalho.
Como nota final; se você quiser evitar sobrecarga local, uma abordagem final pode ser:
redisDB.SetAdd(string.Format(keyFormat, row.Field<int>("Id")),
row.Field<int>("Value"), flags: CommandFlags.FireAndForget);
Isso envia tudo pelo fio, sem esperar por respostas nem alocar
Task
incompleta s para representar valores futuros. Você pode querer fazer algo como um Ping
no final sem dispare e esqueça, para verificar se o servidor ainda está falando com você. Observe que o uso do fire-and-forget significa que você não notará nenhum erro do servidor relatado.