Achter de schermen doet SE.Redis behoorlijk wat werk om pakketfragmentatie te voorkomen, dus het is niet verwonderlijk dat het in jouw geval vrij gelijkaardig is. Het belangrijkste verschil tussen batching en flat pipelining zijn:
- een batch zal nooit worden verweven met concurrerende bewerkingen op dezelfde multiplexer (hoewel het op de server kan worden verweven; om te voorkomen dat u een
multi
moet gebruiken /exec
transactie of een Lua-script) - een batch zal altijd de kans op ondermaatse pakketten vermijden, omdat deze van tevoren op de hoogte is van alle gegevens
- maar tegelijkertijd moet de hele batch worden voltooid voordat er iets kan worden verzonden, dus dit vereist meer buffering in het geheugen en kan kunstmatig latentie veroorzaken
In de meeste gevallen zult u er beter aan doen door batches te vermijden, aangezien SE.Redis het meeste van wat het doet automatisch bereikt wanneer u gewoon werk toevoegt.
Als laatste opmerking; als u lokale overhead wilt vermijden, kan een laatste benadering zijn:
redisDB.SetAdd(string.Format(keyFormat, row.Field<int>("Id")),
row.Field<int>("Value"), flags: CommandFlags.FireAndForget);
Dit stuurt alles naar beneden, wacht niet op antwoorden en wijst ook geen onvolledige Task
toe s om toekomstige waarden weer te geven. Misschien wil je iets doen als een Ping
aan het einde zonder fire-and-forget, om te controleren of de server nog steeds met je praat. Merk op dat het gebruik van 'fire-and-forget' betekent dat u geen serverfouten zult opmerken die worden gerapporteerd.