Redis ZSCAN

Redis Zscan



Iteruj nad członkami posortowanego zestawu

Jak wszyscy wiecie, posortowane zestawy Redis wywodzą się ze zwykłych zestawów, w których każdy element jest uporządkowany według wartości wyniku w porządku rosnącym. Jeśli dwóch lub więcej członków ma tę samą wartość punktową, są one uporządkowane w porządku leksykograficznym. Zwykle elementy i partytury można bezpośrednio pobrać za pomocą polecenia ZRANGE. Kiedy masz duży posortowany zestaw z tysiącami członków, polecenie ZRANGE może blokować serwer na długi czas, podobnie jak polecenia SMEMBERS i KEYS, co jest wadą. Redis oferuje więc specjalne polecenie o nazwie ZSCAN, które wywodzi się z polecenia SCAN, aby iterować po elementach posortowanego zestawu. Ponieważ polecenie ZSCAN dziedziczy po poleceniu SCAN, prawie wszystkie zachowania są takie same, jak polecenia SCAN ogólnego przeznaczenia.







Jak na podanym rysunku, polecenie SCAN jest iteratorem opartym na kursorze. W związku z tym dostarczenie wszystkich elementów kolekcji Redis wymaga co najmniej jednej iteracji. Ponieważ polecenie ZSCAN dziedziczy po nadrzędnym poleceniu SCAN, zachowanie jest takie samo. W tym przewodniku szczegółowo omówiona zostanie składnia i przypadki użycia polecenia ZSCAN.



Dowództwo ZSCAN

Polecenie ZSCAN jest iteratorem opartym na kursorze, który rozpoczyna iterację od zerowego kursora. Następnie, w każdej iteracji, zwraca zero lub więcej posortowanych elementów zestawu wraz z następnym kursorem, który powinien być użyty jako kursor dla następnego wywołania polecenia. Jeśli zwrócony kursor ma wartość 0 po jednej lub kilku iteracjach, oznacza to, że proces skanowania został zakończony. W tym momencie zwracane są wszystkie posortowane elementy zbioru. Ten proces nazywa się pełną iteracją. Jak widać, polecenie ZSCAN utrzymuje swój stan tylko za pomocą kursora, co prowadzi do ograniczonej świadomości stanu. Dlatego z poleceniem ZSCAN wiążą się następujące wady.



  • Ten sam element może zwracać się w wielu iteracjach.
  • Jeśli członek nie jest obecny na początku procesu skanowania, istnieje prawdopodobieństwo, że nie zwróci tego członka podczas pełnej iteracji.

Ponadto nie ma gwarancji co do liczby zwróconych członków. W niektórych przypadkach, jeśli posortowany zestaw jest bardzo mały, wszystkie elementy członkowskie mogą zostać zwrócone w pierwszej iteracji. Ponieważ Redis używa specjalnego formatu kodowania spakowanego z pojedynczą alokacją do przechowywania członków do momentu osiągnięcia maksymalnej liczby elementów. Polecenie ZSCAN może zwrócić kursor tylko wtedy, gdy skanowana struktura danych jest reprezentowana jako tablica mieszająca.





Składnia:
Polecenie ZSCAN używa prawie tej samej składni co polecenie SCAN, z wyjątkiem tego, że jako pierwszy argument akceptuje posortowany klucz zestawu. Składnia polecenia z dozwolonymi argumentami jest następująca:

Kursor ZSCAN sorted_set_key [ DOPASUJ wzór ] [ COUNT member_count ]

sorted_set_key : Klucz posortowanego zestawu.
Kursor : Wartość kursora zaczyna się od 0 i kończy na 0, jeśli jest to pełna iteracja.



Następujące argumenty są opcjonalne:

MECZ : Wzorzec do dopasowania podczas pobierania elementów w każdej iteracji. Zwracani są tylko dopasowani członkowie.
LICZYĆ : Przybliżona liczba członków do zwrócenia w każdej iteracji.

Zwrócony zestaw wyników na iterację zawiera kilka elementów. Pierwsza część to 64-bitowa liczba całkowita bez znaku, która reprezentuje kursor, który ma zostać przekazany do następnego wywołania. Następna część to tablica członków i powiązanych partytur.

Przypadek użycia 1 – Odzyskaj wszystkich członków i ich ukończone misje w grze online

Załóżmy, że firma zajmująca się grami online prowadzi tabelę wyników przy użyciu posortowanego zestawu Redis. Ponieważ masowi użytkownicy aktywnie grają w tę grę, potrzebują sposobu na odzyskanie każdego gracza i związanego z nim wyniku, czyli liczby ukończonych misji. Konieczne jest wykonanie pobierania bez blokowania serwera. Dlatego zaleca się użycie polecenia ZSCAN w następujący sposób:

Najpierw tworzymy posortowany zestaw z kilkoma graczami i ukończoną liczbą misji.

zadd Leaderboard 12 Gracz6:Jan 4 Gracz2: Mary 22 Gracz1:Patel piętnaście Gracz: jedenaście 23 Gracz5: Ann 30 Gracz7: surowy 23 Gracz12:Abby dwa Gracz13: Nicky 6 Gracz9: Jeremy 7 Gracz45:Kina

Teraz możemy iterować po członkach posortowanego zestawu w następujący sposób:

zscan Leaderboard 0

Wyjście:

Wartość kursora wynosi 0 w zwróconym zestawie wyników, co oznacza, że ​​wszystkie elementy członkowskie są zwracane na końcu pierwszej iteracji. W takim przypadku, ponieważ liczba członków jest niewielka, Redis reprezentuje tych członków przy użyciu kodowania spakowanego z pojedynczą alokacją. Dlatego dopóki nie zostanie osiągnięty maksymalny rozmiar opakowania lub liczba członków, polecenie zwraca wszystkie elementy w posortowanym zestawie. Nazywa się to pełną iteracją. Ponieważ pod koniec pierwszej iteracji otrzymujemy wszystkich dziesięciu członków i ich wyniki. Jeśli mamy setki członków, jest to reprezentowane w pamięci jako tablica mieszająca. Tak więc zwrócenie wszystkich członków zajmuje kilka iteracji.

Parametr COUNT może służyć do ograniczenia liczby elementów zwracanych w iteracji. Domyślnie ten argument jest ustawiony na 10. Jeśli posortowany zestaw składa się z setek elementów, jest reprezentowany przez tablicę mieszającą w pamięci. Tak więc liczba zwróconych członków wynosi około dziesięciu na iterację. Wartość argumentu LICZBA jest ignorowana, jeśli posortowany zestaw jest za mały.

Przypadek użycia 2 – Pobierz graczy, których nazwa zaczyna się na literę „J”

Polecenia ZSCAN można użyć do odfiltrowania zwróconych elementów członkowskich na podstawie dopasowania wzorca. W takim przypadku należy określić argument PODAJ.POZYCJĘ.

Użyjmy tego samego przykładu z poprzedniego przypadku użycia. Wymagane jest sprowadzenie graczy, których nazwa zaczyna się na literę „J”. Po prostu zaimplementuj kolejną fajną funkcję związaną z grą. Argument PODAJ.POZYCJĘ można określić w następujący sposób:

zscan Leaderboard 0 mecz * J *

Powinno to idealnie zwrócić dwóch członków, których imiona to Jeremy i John.

Wniosek

Podsumowując, polecenie ZSCAN służy do iteracji elementów i wyników posortowanego zestawu Redis. To polecenie zachowuje się tak samo jak polecenie SCAN, z wyjątkiem tego, że polecenie ZSCAN akceptuje klucz set jako pierwszy argument. Jak omówiono w przypadkach użycia, polecenia ZSCAN można używać na różne sposoby, określając argumenty PODAJ.POZYCJĘ i LICZBA, w których można pobrać elementy i powiązane wyniki pasujące do określonego wzorca i ograniczyć zwracaną liczbę elementów na iterację. Ogólnie rzecz biorąc, polecenie ZSCAN może być przydatne podczas pobierania elementów posortowanego zestawu bez blokowania serwera lub klienta.