Redis ZSCAN

Redis Zscan



Iteracija preko članova sortiranog skupa

Kao što svi znate, Redis sortirani skupovi izvedeni su iz regularnih skupova gdje je svaki član poredan prema vrijednosti rezultata u rastućem redoslijedu. Ako dva ili više članova imaju istu vrijednost rezultata, poredani su prema leksikografskom redu. Obično se članovi i rezultati mogu izravno dohvatiti pomoću naredbe ZRANGE. Kada imate veliki sortirani skup s tisućama članova, naredba ZRANGE može dugo blokirati poslužitelj kao naredbe SMEMBERS i KEYS što je nedostatak. Dakle, Redis nudi posebnu naredbu zvanu ZSCAN koja je izvedena iz naredbe SCAN za ponavljanje preko članova sortiranog skupa. Budući da naredba ZSCAN nasljeđuje naredbu SCAN, gotovo su sva ponašanja ista kao naredba SCAN opće namjene.







Kao na danoj slici, naredba SCAN je iterator koji se temelji na kursoru. Stoga je potrebna jedna ili više iteracija kako bi se osigurale sve stavke Redis kolekcije. Budući da naredba ZSCAN nasljeđuje nadređenu naredbu SCAN, ponašanje je isto. U ovom će se vodiču detaljno raspravljati o sintaksi i slučajevima korištenja naredbe ZSCAN.



Naredba ZSCAN

ZSCAN naredba je kursorski iterator koji iteraciju započinje s 0. kursorom. Nakon toga, u svakoj iteraciji, vraća nula ili više sortiranih članova skupa zajedno sa sljedećim kursorom koji bi se trebao koristiti kao kursor za sljedeći poziv naredbe. Ako je vraćeni kursor 0 nakon jedne ili više iteracija, to znači da je proces skeniranja završen. Svi razvrstani članovi skupa vraćaju se u ovoj točki. Ovaj proces se naziva puna iteracija. Kao što ste mogli vidjeti, ZSCAN naredba čuva svoje stanje samo pomoću pokazivača što dovodi do ograničene svijesti o stanju. Stoga su sljedeći nedostaci povezani s naredbom ZSCAN.



  • Isti element može se vratiti u više ponavljanja.
  • Ako član nije prisutan na početku procesa skeniranja, postoji vjerojatnost da se taj član neće vratiti tijekom pune iteracije.

Osim toga, nema jamstva za broj vraćenih članova. U nekim slučajevima, ako je sortirani skup vrlo mali, svi članovi mogu biti vraćeni u prvoj iteraciji. Budući da Redis koristi poseban format kodiranja pakiran s jednom dodjelom za zadržavanje članova dok se ne dosegne maksimalan broj stavki. Naredba ZSCAN može vratiti kursor samo ako je skenirana struktura podataka predstavljena kao hash tablica.





Sintaksa:
Naredba ZSCAN koristi gotovo istu sintaksu kao naredba SCAN osim što prihvaća sortirani skupni ključ kao prvi argument. Sintaksa naredbe s dopuštenim argumentima je sljedeća:

ZSCAN kursor sorted_set_key [ MATCH uzorak ] [ COUNT member_count ]

sortirani_set_ključ : Ključ sortiranog skupa.
Pokazivač : Vrijednost kursora počinje od 0 i završava na 0 ako se radi o punoj iteraciji.



Sljedeći argumenti nisu obavezni:

USPOREDI SE : Uzorak za podudaranje prilikom dohvaćanja elemenata u svakoj iteraciji. Vraćaju se samo upareni članovi.
RAČUNATI : Približan broj članova koji se vraćaju u svakoj iteraciji.

Vraćeni skup rezultata po iteraciji sadrži nekoliko elemenata. Prvi dio je 64-bitni cijeli broj bez predznaka koji predstavlja kursor koji treba proslijediti u sljedeći poziv. Sljedeći dio je niz članova i povezanih rezultata.

Slučaj upotrebe 1 – dohvatite sve članove i njihove dovršene misije online igre

Pretpostavimo da tvrtka za online igre održava ljestvicu s najboljim rezultatima koristeći Redis sortirani skup. Budući da veliki broj korisnika aktivno igra igru, potreban im je način da dohvate svakog igrača i njegov pridruženi rezultat koji je broj dovršenih misija. Obavezno je izvršiti dohvaćanje bez blokiranja poslužitelja. Dakle, preporuka je koristiti naredbu ZSCAN na sljedeći način:

Prvo, stvaramo sortirani set s nekim igračima i dovršenim brojem misija.

zadd LeaderBoard 12 Igrač6: Ivan 4 Igrač2: Marija 22 Igrač1: Patel petnaest Igrač: jedanaest 23 Igrač5: Ann 30 Igrač7: Oštro 23 Igrač 12: abby dva Igrač 13: Nicky 6 Igrač9: Jeremy 7 Igrač45:Kina

Sada možemo iterirati preko članova sortiranog skupa na sljedeći način:

zscan LeaderBoard 0

Izlaz:

Vrijednost kursora je 0 u vraćenom skupu rezultata, što znači da su svi članovi vraćeni na kraju prve iteracije. U ovom slučaju, budući da je broj članova malen, Redis predstavlja te članove korištenjem pakiranog kodiranja s jednom dodjelom. Stoga, dok se ne postigne najveća veličina paketa ili broj članova, naredba vraća sve članove u sortiranom skupu. To se zove puna iteracija. Zato što na kraju prve iteracije primamo svih deset članova i njihove bodove. Ako imamo stotine članova, to je predstavljeno kao hash tablica u memoriji. Dakle, potrebno je nekoliko iteracija da se vrate svi članovi.

Parametar COUNT može se koristiti za ograničavanje broja vraćenih članova u iteraciji. Prema zadanim postavkama, ovaj argument je postavljen na 10. Ako se sortirani skup sastoji od stotina članova, predstavljen je hash tablicom u memoriji. Dakle, broj vraćenih članova je oko deset po iteraciji. Vrijednost argumenta COUNT se zanemaruje ako je sortirani skup premali.

Slučaj upotrebe 2 – Dohvatite igrače čije ime počinje slovom 'J'

Naredba ZSCAN može se koristiti za filtriranje vraćenih članova na temelju podudaranja uzorka. U tom slučaju mora biti specificiran argument MATCH.

Iskoristimo isti primjer iz prethodnog slučaja upotrebe. Uvjet je dohvatiti igrače čije ime počinje slovom 'J'. To je samo implementacija sljedeće cool značajke u vezi s igrom. Argument MATCH može se odrediti na sljedeći način:

zscan LeaderBoard 0 odgovarati * J *

Ovo bi idealno trebalo vratiti dva člana čija su imena Jeremy i John.

Zaključak

Ukratko, naredba ZSCAN koristi se za ponavljanje članova i rezultata Redis sortiranog skupa. Ova naredba ponaša se isto kao naredba SCAN, osim što naredba ZSCAN prihvaća postavljeni ključ kao prvi argument. Kao što je objašnjeno u slučajevima upotrebe, naredba ZSCAN može se koristiti na različite načine određivanjem argumenata MATCH i COUNT gdje možete dohvatiti članove i pridružene rezultate koji odgovaraju određenom uzorku i ograničiti vraćeni broj članova po iteraciji. Općenito, naredba ZSCAN može biti korisna pri dohvaćanju članova sortiranog skupa bez blokiranja poslužitelja ili klijenta.