2015-08-18 19 views
6

TL; DR: Która z trzech poniższych opcji jest najbardziej wydajna w przypadku stron z Redis?Zalety/wady strategii Redis paginacji

Wdrażam stronę internetową z wieloma wpisami wygenerowanymi przez użytkowników, które są zapisywane w relacyjnej bazie danych, a następnie kopiowane do Redis w postaci Hashes z kluczami takimi jak site:{site_id}:post:{post_id}.

Chcę wykonać proste zapytania paginacji przeciwko Redis, w celu implementacji paginacji lazy-load (tzn. Użytkownik przewija w dół, wysyłamy żądanie Ajax do serwera z prośbą o kolejną porcję wpisów) w stylu Pinteresta berło.

Następnie utworzyłem Set, aby śledzić opublikowane posty i klucze, takie jak site:{site_id}:posts. Wybrałem zestawy, ponieważ nie chcę mieć zduplikowanych identyfikatorów w kolekcji i mogę to zrobić szybko za pomocą prostego SADD (nie trzeba sprawdzać, czy identyfikator istnieje) na każdej aktualizacji DB.

Cóż, jak Zestawy nie są sortowane, ja wheighting plusy i minusy opcjach mam podzielony na strony:

1) Za pomocą polecenia SSCAN podzielony na strony moich już wdrożone zestawy

W takim przypadku mógłbym zatrzymać zwracany kursor skanowania w sesji użytkownika , a następnie wysłać go z powrotem do serwera na następne żądanie (nie wydaje się, że jest niezawodny, gdy wielu użytkowników uzyskuje dostęp do bazy danych i aktualizuje ją: pod numerem kursor byłby nieprawidłowe i zwróć dziwne wyniki - , chyba że jest pewne zastrzeżenie, którego mi brakuje).

2) byłaby moich zestawów do korzystania Lists lub Sorted Sets zamiast

Wtedy mógłbym paginate użyciu LRANGE lub ZRANGE. Lista wydaje się być najbardziej wydajną i naturalną opcją dla mojego przypadku użycia. Jest to idealny do paginacji i porządkowania według daty, ale po prostu nie mogę sprawdzić dla jednego przedmiotu istnienia bez pętli wszystkich list. Sortuj zestawy wydaje się łączyć zalety obu zestawów i list, ale zużywa więcej zasobów serwera .

3) Należy stosując regularne zestawy i zapisać numer strony jako część klucza

byłoby coś site:{site_id}:{page_number}:posts. To było recommended way przed zaimplementowaniem poleceń skanowania.

Pytanie brzmi: który z nich jest najbardziej efektywny/najprostszy? Czy jest jakaś inna zalecana opcja, nie wymieniona tutaj?

+2

"najlepsze" jest całkowicie subiektywne. To, co jest dla mnie najlepsze, niekoniecznie jest dobre dla ciebie. –

+2

+1 ponownie "najlepiej". Używanie listy nie jest dobrym wyborem, ponieważ LRANGE to O (N). Go with Sorted Sets - najprostszy i najczystszy. –

+0

@SergioTulentsev Tak, może "najlepsze" nie jest ... najlepszym słowem. Pomyślę o czymś mniej subiektywnym i edytuję pytanie. Dzięki –

Odpowiedz

4

„Best” najlepiej służy prywatną :)

polecam iść z 2 podejścia, ale na pewno korzystać z posortowane zestawy na listach.Nie tylko ma to sens w przypadku tego rodzaju pracy (patrz ZRANGE), ale także jest bardziej wydajne pod względem złożoności w porównaniu do LRANGE - na liście.

+0

Twój komentarz (i odpowiedź) sprawił, że głębiej zbadałem różnicę między LRANGE [O (S + N)] i ZRANGE [O (log (N) + M)] i przekonaj się, że może być ogromna! Ponadto doprowadziło mnie to do tego [starego, ale złotego posta od Reddita] (https://www.reddit.com/r/programming/comments/1f2ml3/what_does_olog_n_mean_exactly/), które wyjaśnia O (log n) w bardzo przejrzystym droga. Komentarze są cholernie zabawne !! Cóż, odpowiedź została przyjęta. Twoje zdrowie. –

Powiązane problemy