Redis Zscan

Redis Zscan

Iterere over medlemmene i et sortert sett

Som dere alle vet, er Redis -sorterte sett avledet fra de vanlige settene der hvert medlem er bestilt av sin poengverdi i stigende rekkefølge. Hvis to eller flere medlemmer har samme poengverdi, bestilles de etter leksikografisk ordre. Vanligvis kan medlemmene og poengsumene hentes direkte ved hjelp av Zrange -kommandoen. Når du har et stort sortert sett med tusenvis av medlemmer, kan Zrange -kommandoen blokkere serveren i lang tid som Smembers and Keys -kommandoene, som er en ulempe. Så, Redis tilbyr en spesiell kommando kalt Zscan som er avledet fra skannekommandoen for å iterere over medlemmene i et sortert sett. Siden Zscan -kommandoen arver fra skannekommandoen, er nesten all atferden den samme som den generelle skannekommandoen for generelle formål.

Som i den gitte figuren er skannekommandoen en markørbasert iterator. Derfor tar det en eller flere iterasjoner for å gi alle elementene i en Redis -samling. Siden zscan -kommandoen arver fra foreldreskannekommandoen, er oppførselen den samme. I denne guiden vil syntaks- og brukstilfeller av ZSCAN -kommandoen bli diskutert i detalj.

Zscan -kommandoen

Zscan-kommandoen er en markørbasert iterator som starter iterasjonen med den 0. markøren. Etterpå, i hver iterasjon, returnerer den null eller mer sorterte setmedlemmer sammen med neste markør som skal brukes som markøren for følgende kommandoanrop. Hvis den returnerte markøren er 0 etter en eller flere iterasjoner, betyr det at skanneprosessen er over. Alle de sorterte settmedlemmene returneres på dette tidspunktet. Denne prosessen kalles en full iterasjon. Som du ser, holder Zscan -kommandoen staten bare ved å bruke en markør som fører til en begrenset statsbevissthet. Derfor er følgende ulemper assosiert med ZSCAN -kommandoen.

  • Det samme elementet kan returnere i flere iterasjoner.
  • Hvis et medlem ikke er til stede i starten av skanningsprosessen, er det sannsynlighet for ikke å returnere det medlemmet under en full iterasjon.

I tillegg er det ingen garanti for tellingen av de returnerte medlemmene. I noen tilfeller, hvis det sorterte settet er veldig lite, kan alle medlemmene returneres i den aller første iterasjonen. Fordi Redis bruker en spesiell enkeltfordelingspakket kodingsformat for å holde medlemmene til en maksimal varetall er nådd. ZSCAN -kommandoen er bare i stand til å returnere en markør hvis den skannede datastrukturen er representert som en hasjtabell.

Syntaks:
Zscan -kommandoen bruker nesten samme syntaks som skannekommandoen, bortsett fra at den godtar en sortert setttast som det første argumentet. Kommandosyntaksen med de tillatte argumentene er som følger:

Zscan sorted_set_key cursor [match mønster] [count member_count]

sorted_set_key: Nøkkelen til det sorterte settet.
Markør: Markørverdien starter fra 0 og slutter på 0 hvis det er en full iterasjon.

Følgende argumenter er valgfrie:

KAMP: Et mønster som skal matche når du henter elementene i hver iterasjon. Bare de matchede medlemmene blir returnert.
TELLE: Det omtrentlige antall medlemmer som skal returneres i hver iterasjon.

Det returnerte resultatsettet per iterasjon inneholder et par elementer. Den første delen er et 64-bits usignert heltall som representerer markøren som skal sendes inn i neste samtale. Neste del er en rekke medlemmer og tilhørende score.

Bruk sak 1 - Hent alle medlemmene og deres fullførte oppdrag i et online spill

La oss anta at et online spillfirma opprettholder en toppliste ved hjelp av Redis Sortered Set. Siden massive brukere aktivt spiller spillet, trenger de en måte å hente hver spiller og deres tilhørende poengsum, som er antall fullførte oppdrag. Det er et must å utføre henting uten å blokkere serveren. Så anbefalingen er å bruke ZSCAN -kommandoen som følger:

Først oppretter vi et sortert sett med noen spillere og det fullførte antall oppdrag.

Zadd Leaderboard 12 Player6: John 4 Player2: Mary 22 Player1: Patel 15 Player: 11 23 Player5: Ann 30 Player7: Harsh 23 Player12: Abby 2 Player13: Nicky 6 Player9: Jeremy 7 Player45: Kina

Nå kan vi iterere over medlemmene av det sorterte settet som følger:

Zscan toppliste 0

Produksjon:

Markørverdien er 0 i det returnerte resultatsettet som betyr at alle medlemmene returneres på slutten av den første iterasjonen. I dette tilfellet, fordi antall medlemmer er lite, representerer Redis disse medlemmene som bruker en enkeltfordeling pakket koding. Derfor, inntil en maksimal pakkestørrelse eller medlemstall er nådd, returnerer kommandoen alle medlemmene i det sorterte settet. Dette kalles en full iterasjon. For på slutten av den første iterasjonen mottar vi alle ti medlemmer og resultatene deres. Hvis vi har hundrevis av medlemmer, er det representert som et hasjbord i minnet. Så det tar flere iterasjoner å returnere alle medlemmene.

Telleparameteren kan brukes til å begrense antallet medlemmer som returneres i en iterasjon. Som standard er dette argumentet satt til 10. Hvis det sorterte settet består av hundrevis av medlemmer, er det representert med en hasjbord i minnet. Så antallet returnerte medlemmer er rundt ti per iterasjon. Verdien av tellingsargumentet blir ignorert hvis det sorterte settet er for lite.

Bruk sak 2 - Hent spillerne hvis navn starter med bokstaven “J”

ZSCAN -kommandoen kan brukes til å filtrere ut de returnerte medlemmene basert på en mønsterkamp. I så fall må kampargumentet spesifiseres.

La oss bruke det samme eksemplet fra forrige brukssak. Kravet er å hente spillerne hvis navn starter med bokstaven “J”. Det er bare å implementere den neste kule funksjonen relatert til spillet. Match -argumentet kan spesifiseres som følger:

zscan toppliste 0 kamp *j *

Dette bør ideelt sett returnere to medlemmer hvis navn er Jeremy og John.

Konklusjon

Oppsummert er Zscan -kommandoen brukt til å iterere over medlemmene og score til et Redis -sortert sett. Denne kommandoen oppfører seg den samme som skannekommandoen, bortsett fra at ZSCAN -kommandoen godtar den angitte tasten som det første argumentet. Som diskutert i brukssakene, kan ZSCAN -kommandoen brukes på forskjellige måter ved å spesifisere kampen og telle argumenter der du kan hente medlemmene og tilhørende score som samsvarer med et spesifikt mønster og begrense det returnerte medlemstallet per iterasjon. Totalt sett kan ZSCAN -kommandoen være nyttig når du henter medlemmene i et sortert sett uten å blokkere serveren eller klienten.