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

Pipelining vs Batching no Stackexchange.Redis


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.