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.