Za kulisami SE.Redis wykonuje sporo pracy, aby uniknąć fragmentacji pakietów, więc nie jest zaskakujące, że w twoim przypadku jest podobnie. Główna różnica między dozowaniem a płaskim rurociągiem to:
- Pakiet nigdy nie będzie przeplatany z konkurującymi operacjami na tym samym multiplekserze (chociaż może być przeplatany na serwerze; aby uniknąć konieczności użycia
multi
/exec
transakcja lub skrypt Lua) - partia zawsze będzie unikać szansy na zbyt małe pakiety, ponieważ zna wszystkie dane z wyprzedzeniem
- ale jednocześnie cała partia musi zostać ukończona, zanim cokolwiek będzie mogło zostać wysłane, więc wymaga to większego buforowania w pamięci i może sztucznie wprowadzać opóźnienia
W większości przypadków zrobisz to lepiej, unikając grupowania, ponieważ SE.Redis osiąga większość tego, co robi automatycznie po prostu dodając pracę.
Jako ostatnia uwaga; jeśli chcesz uniknąć lokalnych kosztów ogólnych, jednym ostatecznym podejściem może być:
redisDB.SetAdd(string.Format(keyFormat, row.Field<int>("Id")),
row.Field<int>("Value"), flags: CommandFlags.FireAndForget);
To wysyła wszystko, nie czekając na odpowiedzi ani przydzielając niekompletnego Task
s do reprezentowania przyszłych wartości. Możesz chcieć zrobić coś takiego jak Ping
na końcu bez fire-and-forget, aby sprawdzić serwer nadal z tobą rozmawia. Pamiętaj, że użycie opcji „uruchom i zapomnij” oznacza, że nie zauważysz żadnych zgłaszanych błędów serwera.