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
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ń.
- 1. Równoległe pipelining
- 2. Sharding bazy danych i JPA
- 3. Redis na Heroku Sharding
- 4. Android dziwne testy sharding
- 5. Auto sharding postgresql?
- 6. Czy Cassandra obsługuje sharding?
- 7. pipelining vs transakcja w redis
- 8. Sharding by ObjectID, czy to właściwa droga?
- 9. replikacja mongoDB + sharding na 2 serwerach uzasadnione?
- 10. Dynamiczne ustawianie __tablename__ dla sharding w SQLAlchemy?
- 11. Pipelining a częściowa aplikacja do projektowania interfejsu API
- 12. Wydawanie wielu żądań przy użyciu protokołu HTTP/1.1 Pipelining
- 13. Replikacja Redis i różnica w krotności redise (klastra)
- 14. Servicestack ORMLite Query Multiple
- 15. Czy można używać domyślnych poświadczeń sieciowych w programie Mailkit i Exchange?
- 16. F # - Konwersja zagnieżdżonych pętli for do stylu funkcjonalnego
- 17. Dlaczego Math.sqrt (i * i) .floor == i?
- 18. "İ" .toLowerCase()! = "I"
- 19. CSS "i" i "lub"
- 20. UILabel i numberOfLines i sizeToFit:
- 21. Jack i Jill i destinationDir
- 22. Szyny i przecinak i edytor
- 23. Różnica między (++ i) oraz (i ++)
- 24. SOX i zanikanie i zanikanie
- 25. Dlaczego "int i = i;" prawny?
- 26. multidplyr i group_by() i filter()
- 27. atakujących i (handlowe i) operatora
- 28. Zapytanie "i" Linq i "operatory
- 29. kolby i skalowanie i współbieżności
- 30. Złamanie Mongo nie dzieli dużej kolekcji między odłamkami.
Dzięki milionowi za wgląd, szczególnie w kwestię równoległości ruchu! – idrarig