Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Pipelining vs Batching w Stackexchange.Redis

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.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Odczytywanie danych z Redis do Flink

  2. Używanie puli wieloprocesowej z zadania seler powoduje wyjątek

  3. Porównanie wydajności użycia skrótów Redis z wieloma kluczami

  4. Łączenie kontenera Redis z innym kontenerem (Docker)

  5. json.loads i Redis w Pythonie 3.5