Зад кулисите, SE.Redis върши доста работа, за да се опита да избегне фрагментирането на пакети, така че не е изненадващо, че е доста подобно във вашия случай. Основната разлика между пакетирането и плоския тръбопровод са:
- партида никога няма да бъде преплитана с конкуриращи се операции на един и същ мултиплексор (въпреки че може да бъде преплетена на сървъра; за да избегнете това, трябва да използвате
multi
/exec
транзакция или Lua скрипт) - партида винаги ще избягва вероятността от пакети с малък размер, защото знае за всички данни предварително.
- но в същото време цялата партида трябва да бъде завършена, преди да може да се изпрати нещо, така че това изисква повече буфериране в паметта и може изкуствено да доведе до забавяне.
В повечето случаи ще се справите по-добре, като избягвате пакетирането, тъй като SE.Redis постига повечето от това, което прави автоматично когато просто добавяте работа.
Като последна бележка; ако искате да избегнете локални излишни разходи, един последен подход може да бъде:
redisDB.SetAdd(string.Format(keyFormat, row.Field<int>("Id")),
row.Field<int>("Value"), flags: CommandFlags.FireAndForget);
Това изпраща всичко надолу, нито чака отговори, нито разпределя непълна Task
s за представяне на бъдещи стойности. Може да искате да направите нещо като Ping
накрая без пожарни и забрави, за да провериш, че сървърът все още говори с теб. Обърнете внимание, че използването на „запали и забрави“ означава, че няма да забележите грешки в сървъра, за които се съобщава.