Bag kulisserne gør SE.Redis en del arbejde for at forsøge at undgå pakkefragmentering, så det er ikke overraskende, at det er ret ens i dit tilfælde. Den største forskel mellem batching og flad pipelining er:
- en batch vil aldrig blive interleaves med konkurrerende operationer på den samme multiplexer (selvom den kan være interleaves på serveren; for at undgå det skal du bruge en
multi
/exec
transaktion eller et Lua-script) - en batch vil altid undgå chancen for understørrelsespakker, fordi den kender til alle data på forhånd
- men samtidig skal hele batchen færdiggøres, før noget kan sendes, så dette kræver mere buffering i hukommelsen og kan kunstigt indføre latens
I de fleste tilfælde vil du gøre det bedre ved at undgå batching, da SE.Redis opnår det meste af det, den gør automatisk når du blot tilføjer arbejde.
Som en sidste bemærkning; hvis du vil undgå lokale overhead, kan en sidste fremgangsmåde være:
redisDB.SetAdd(string.Format(keyFormat, row.Field<int>("Id")),
row.Field<int>("Value"), flags: CommandFlags.FireAndForget);
Dette sender alt ned ad tråden, hverken venter på svar eller tildeler ufuldstændig Task
s at repræsentere fremtidige værdier. Du vil måske gøre noget som et Ping
til sidst uden brand-og-glem, for at kontrollere, at serveren stadig taler til dig. Bemærk, at brug af brand-og-glem betyder, at du ikke vil bemærke nogen serverfejl, der bliver rapporteret.