sql >> Database >  >> NoSQL >> Redis

Pipelining versus batching in Stackexchange.Redis

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.




  1. Django Selderij krijgt taaktelling

  2. Hoe werk je objecten in de array van een document bij (geneste updates)

  3. MongoDB extraheert waarden uit BasicDBObject (Java)

  4. Kon geen verbinding maken met Redis om 127.0.0.1:6379:Verbinding geweigerd