sql >> Databáze >  >> NoSQL >> Redis

Pipelining vs Batching v Stackexchange.Redis

V zákulisí dělá SE.Redis docela dost práce, aby se vyhnul fragmentaci paketů, takže není divu, že ve vašem případě je to docela podobné. Hlavní rozdíl mezi dávkovým a plochým potrubím je:

  • dávka nebude nikdy prokládána konkurenčními operacemi na stejném multiplexeru (ačkoli může být prokládána na serveru; abyste se vyhnuli tomu, že musíte použít multi /exec transakce nebo skriptu Lua)
  • dávka se vždy vyhne riziku poddimenzovaných paketů, protože ví o všech datech předem
  • ale zároveň musí být před odesláním čehokoli dokončena celá dávka, takže to vyžaduje více ukládání do vyrovnávací paměti a může uměle způsobit latenci.

Ve většině případů uděláte lépe, když se vyhnete dávkování, protože SE.Redis dosahuje většiny toho, co dělá automaticky při jednoduchém přidání práce.

Jako poslední poznámka; pokud se chcete vyhnout místní režii, jeden poslední přístup může být:

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

Tím se vše odešle po drátě, nečeká se na odpovědi ani nepřiděluje nedokončený Task s reprezentovat budoucí hodnoty. Možná budete chtít provést něco jako Ping na konci bez fire-and-forget, abyste zkontrolovali, že server s vámi stále mluví. Všimněte si, že použití fire-and-forget znamená, že si nevšimnete žádných chyb serveru, které by byly hlášeny.




  1. proč se využití paměti redis nesníží, když se stáhne polovina klíčů

  2. Laravel - Spouštění úloh v sekvenci

  3. Fronta zpráv Redis pubsub, ale se zpětným voláním, jako v ZeroMQ

  4. Vývoj databáze Python a MongoDB