Redis ZSCAN

Redis Zscan



Gentag over medlemmerne af et sorteret sæt

Som I alle ved, er Redis-sorterede sæt afledt af de almindelige sæt, hvor hvert medlem er sorteret efter sin scoreværdi i stigende rækkefølge. Hvis to eller flere medlemmer har samme scoreværdi, er de ordnet efter leksikografisk rækkefølge. Normalt kan medlemmerne og scoringerne hentes direkte ved hjælp af ZRANGE-kommandoen. Når du har et stort sorteret sæt med tusindvis af medlemmer, kan ZRANGE-kommandoen blokere serveren i lang tid ligesom kommandoerne SMEMBERS og KEYS, hvilket er en ulempe. Så Redis tilbyder en speciel kommando kaldet ZSCAN, som er afledt af SCAN-kommandoen til at iterere over medlemmerne af et sorteret sæt. Da ZSCAN-kommandoen arver fra SCAN-kommandoen, er næsten al adfærd den samme som den generelle SCAN-kommando.







Som i den givne figur er SCAN-kommandoen en cursor-baseret iterator. Derfor kræver det en eller flere iterationer at levere alle elementerne i en Redis-samling. Da ZSCAN-kommandoen arver fra den overordnede SCAN-kommando, er adfærden den samme. I denne vejledning vil syntaks og anvendelsestilfælde af ZSCAN-kommandoen blive diskuteret i detaljer.



ZSCAN-kommandoen

ZSCAN-kommandoen er en cursor-baseret iterator, der starter iterationen med den 0. markør. Bagefter returnerer den i hver iteration nul eller flere sorterede sætmedlemmer sammen med den næste markør, der skal bruges som markør for det følgende kommandokald. Hvis den returnerede markør er 0 efter en eller flere iterationer, betyder det, at scanningsprocessen er slut. Alle de sorterede sætmedlemmer returneres på dette tidspunkt. Denne proces kaldes en fuld iteration. Som du kunne se, beholder ZSCAN-kommandoen sin tilstand kun ved hjælp af en markør, hvilket fører til en begrænset tilstandsbevidsthed. Derfor er følgende ulemper forbundet med ZSCAN-kommandoen.



  • Det samme element kan vende tilbage i flere iterationer.
  • Hvis et medlem ikke er til stede ved starten af ​​scanningsprocessen, er der en sandsynlighed for ikke at returnere det pågældende medlem under en fuld iteration.

Derudover er der ingen garanti på antallet af returnerede medlemmer. I nogle tilfælde, hvis det sorterede sæt er meget lille, kan alle medlemmer blive returneret i den allerførste iteration. Fordi Redis bruger et særligt enkelt allokeringspakket kodningsformat til at holde medlemmerne, indtil det maksimale antal varer er nået. ZSCAN-kommandoen er kun i stand til at returnere en markør, hvis den scannede datastruktur er repræsenteret som en hash-tabel.





Syntaks:
ZSCAN-kommandoen bruger næsten den samme syntaks som SCAN-kommandoen bortset fra at den accepterer en sorteret sætnøgle som det første argument. Kommandosyntaksen med de tilladte argumenter er som følger:

ZSCAN sorted_set_key cursor [ MATCH mønster ] [ COUNT medlemsantal ]

sorteret_sæt_nøgle : Nøglen til det sorterede sæt.
cursoren : Markørværdien starter fra 0 og slutter ved 0, hvis det er en fuld iteration.



Følgende argumenter er valgfrie:

MATCH : Et mønster, der skal matches, når elementerne hentes i hver iteration. Kun de matchede medlemmer returneres.
TÆLLE : Det omtrentlige antal medlemmer, der skal returneres i hver iteration.

Det returnerede resultatsæt pr. iteration indeholder et par elementer. Den første del er et 64-bit usigneret heltal, der repræsenterer markøren, der skal videregives til det næste opkald. Den næste del er en række medlemmer og tilhørende partiturer.

Use Case 1 – Hent alle medlemmer og deres fuldførte missioner i et onlinespil

Lad os antage, at et onlinespilfirma vedligeholder en rangliste ved hjælp af Redis-sorterede sæt. Da massive brugere aktivt spiller spillet, har de brug for en måde at hente hver spiller og deres tilknyttede score, som er antallet af gennemførte missioner. Det er et must at udføre hentning uden at blokere serveren. Så anbefalingen er at bruge ZSCAN-kommandoen som følger:

Først opretter vi et sorteret sæt med nogle spillere og det gennemførte antal missioner.

zadd Leaderboard 12 Spiller 6: John 4 Spiller 2: Mary 22 Spiller 1: Patel femten Spiller: elleve 23 Spiller 5: Ann 30 Spiller 7: Barsk 23 Spiller 12:abby to Spiller 13: Nicky 6 Spiller 9: Jeremy 7 Spiller 45: Kina

Nu kan vi iterere over medlemmerne af det sorterede sæt som følger:

zscan Leaderboard 0

Produktion:

Cursorværdien er 0 i det returnerede resultatsæt, hvilket betyder, at alle medlemmer returneres ved slutningen af ​​den første iteration. I dette tilfælde, fordi antallet af medlemmer er lille, repræsenterer Redis disse medlemmer ved hjælp af en enkelt-allokeringspakket kodning. Indtil en maksimal pakkestørrelse eller medlemsantal er nået, returnerer kommandoen derfor alle medlemmer i det sorterede sæt. Dette kaldes en fuld iteration. For i slutningen af ​​den første iteration modtager vi alle ti medlemmer og deres score. Hvis vi har hundredvis af medlemmer, er det repræsenteret som en hash-tabel i hukommelsen. Så det tager flere gentagelser at returnere alle medlemmerne.

Parameteren COUNT kan bruges til at begrænse antallet af medlemmer, der returneres i en iteration. Som standard er dette argument sat til 10. Hvis det sorterede sæt består af hundredvis af medlemmer, er det repræsenteret af en hash-tabel i hukommelsen. Så antallet af returnerede medlemmer er omkring ti per iteration. Værdien af ​​argumentet COUNT ignoreres, hvis det sorterede sæt er for lille.

Use Case 2 – Hent de spillere, hvis navn starter med bogstavet 'J'

ZSCAN-kommandoen kan bruges til at bortfiltrere de returnerede medlemmer baseret på et mønstermatch. I så fald skal MATCH-argumentet angives.

Lad os bruge det samme eksempel fra den tidligere use case. Kravet er at hente de spillere, hvis navn starter med bogstavet 'J'. Det er bare at implementere den næste fede funktion relateret til spillet. MATCH-argumentet kan specificeres som følger:

zscan Leaderboard 0 match * J *

Dette skulle ideelt set returnere to medlemmer, hvis navne er Jeremy og John.

Konklusion

Sammenfattende bruges ZSCAN-kommandoen til at iterere over medlemmerne og scoringerne af et Redis-sorteret sæt. Denne kommando opfører sig på samme måde som SCAN-kommandoen, bortset fra at ZSCAN-kommandoen accepterer sætnøglen som det første argument. Som diskuteret i use cases, kan ZSCAN-kommandoen bruges på forskellige måder ved at specificere MATCH- og COUNT-argumenterne, hvor du kan hente medlemmerne og tilknyttede scores, der matcher et specifikt mønster, og begrænse antallet af returnerede medlemmer pr. iteration. Samlet set kan ZSCAN-kommandoen være nyttig, når medlemmerne af et sorteret sæt skal hentes uden at blokere serveren eller klienten.