Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Pipelining vs. Batching in Stackexchange.Redis

Hinter den Kulissen leistet SE.Redis einiges an Arbeit, um die Paketfragmentierung zu vermeiden, daher ist es nicht verwunderlich, dass es in Ihrem Fall ziemlich ähnlich ist. Die Hauptunterschiede zwischen Batching und Flat Pipelining sind:

  • ein Stapel wird niemals mit konkurrierenden Operationen auf demselben Multiplexer verschachtelt (obwohl er auf dem Server verschachtelt sein kann; um dies zu vermeiden, müssen Sie einen multi verwenden /exec Transaktion oder ein Lua-Skript)
  • Ein Stapel wird immer die Möglichkeit von zu kleinen Paketen vermeiden, da er alle Daten im Voraus kennt
  • aber gleichzeitig muss der gesamte Batch abgeschlossen sein, bevor irgendetwas gesendet werden kann, also erfordert dies mehr In-Memory-Pufferung und kann zu künstlicher Latenz führen

In den meisten Fällen ist es besser, Batching zu vermeiden, da SE.Redis das meiste, was es tut, automatisch erledigt beim einfachen Hinzufügen von Arbeit.

Als letzte Anmerkung; Wenn Sie lokalen Overhead vermeiden möchten, könnte ein letzter Ansatz sein:

redisDB.SetAdd(string.Format(keyFormat, row.Field<int>("Id")),
    row.Field<int>("Value"), flags: CommandFlags.FireAndForget);

Dies sendet alles über die Leitung, ohne auf Antworten zu warten oder unvollständige Task zuzuweisen s um zukünftige Werte darzustellen. Vielleicht möchten Sie so etwas wie einen Ping machen am Ende ohne Fire-and-Forget, um zu überprüfen, ob der Server noch mit Ihnen spricht. Beachten Sie, dass die Verwendung von Fire-and-Forget bedeutet, dass Sie keine Serverfehler bemerken, die gemeldet werden.