Bakom kulisserna gör SE.Redis en hel del arbete för att försöka undvika paketfragmentering, så det är inte förvånande att det är ganska likt i ditt fall. Huvudskillnaden mellan batching och platt pipelining är:
- en batch kommer aldrig att interfolieras med konkurrerande operationer på samma multiplexer (även om den kan interfolieras på servern; för att undvika det behöver du använda en
multi
/exec
transaktion eller ett Lua-skript) - en batch kommer alltid att undvika risken för underdimensionerade paket, eftersom den känner till all data i förväg
- men samtidigt måste hela batchen slutföras innan någonting kan skickas, så detta kräver mer buffring i minnet och kan på konstgjord väg introducera latens
I de flesta fall kommer du att bli bättre genom att undvika batchning, eftersom SE.Redis uppnår det mesta automatiskt när du bara lägger till arbete.
Som en sista anmärkning; om du vill undvika lokala omkostnader, kan ett sista tillvägagångssätt vara:
redisDB.SetAdd(string.Format(keyFormat, row.Field<int>("Id")),
row.Field<int>("Value"), flags: CommandFlags.FireAndForget);
Detta skickar allt i tråden, varken väntar på svar eller allokerar ofullständig Task
s för att representera framtida värden. Du kanske vill göra något som en Ping
i slutet utan eld-och-glöm, för att kontrollera att servern fortfarande pratar med dig. Observera att användning av eld-och-glöm betyder att du inte kommer att märka några serverfel som rapporteras.