2012-05-09 25 views
6

Załóżmy, że w twojej aplikacji internetowej musisz wykonać wiele wywołań redis, aby wyrenderować stronę, na przykład, zdobywając garść skrótów użytkownika. Aby przyspieszyć, możesz zawijać polecenia redis w sekcji MULTI/EXEC, dzięki czemu możesz korzystać z potokowania, aby uniknąć wielu podróży w obie strony. Ale chcesz też odfiltrować swoje dane, ponieważ masz ich dużo i/lub chcesz rozprowadzać zapisy. Wówczas pipelining nie zadziałałby, ponieważ różne klucze potencjalnie mogłyby żyć na różnych węzłach, chyba że masz jasny obraz układu danych aplikacji i odłamu na podstawie ról zamiast używania funkcji mieszania. Jakie są więc najlepsze praktyki, w których można odfiltrować dane na różnych serwerach bez nadmiernego obniżania wydajności, ponieważ wiele serwerów kontaktuje się, aby wykonać pracę "koncepcyjnie wyjątkową"? Wierzę, że odpowiedź zależy od aplikacji internetowej, którą się rozwija i ostatecznie przeprowadzę testy, ale dobrze byłoby wiedzieć, jak inni radzą sobie z wymienionymi kompromisami.Reding sharding, pipelining i round-trips

Odpowiedz

4

MULTI/EXEC i pipelining to dwie różne rzeczy. Możesz wykonywać MULTI/EXEC bez żadnego potokowania i na odwrót.

Jeśli chcesz odfiltrować i potokować w tym samym czasie, musisz pogrupować operacje do potoku na instancję Redis, a następnie użyć potoku dla każdej instancji.

Oto prosty przykład przy użyciu Ruby https://gist.github.com/2587593

Jednym ze sposobów, w celu dalszej poprawy wydajności jest parallelize ruch na instancje Redis raz operacje zostały pogrupowane (to znaczy zgrupowaniu operacji, wysłanie ich na wszystko równolegle, czekasz na odpowiedzi ze wszystkich instancji).

Jest to nieco bardziej skomplikowane, ponieważ wymagany jest asynchroniczny klient bez blokowania. Aby uzyskać maksymalną wydajność, C/C++ powinno być używane po stronie klienta. Można to łatwo zaimplementować za pomocą hiredis + wybranej pętli zdarzeń.

+0

Dzięki milionowi za wgląd, szczególnie w kwestię równoległości ruchu! – idrarig