Redis ZSCAN

Redis Zscan



Toista lajitellun joukon jäseniä

Kuten kaikki tiedätte, Redisin lajitellut joukot johdetaan tavallisista joukoista, joissa jokainen jäsen on järjestetty sen pistemäärän mukaan nousevaan järjestykseen. Jos kahdella tai useammalla jäsenellä on sama pistemäärä, ne järjestetään leksikografisen järjestyksen mukaan. Yleensä jäsenet ja pisteet voidaan hakea suoraan ZRANGE-komennolla. Kun sinulla on suuri lajiteltu joukko tuhansia jäseniä, ZRANGE-komento saattaa estää palvelimen pitkäksi aikaa, kuten SMEMBERS- ja KEYS-komennot, mikä on haittapuoli. Joten Redis tarjoaa erityisen komennon nimeltä ZSCAN, joka on johdettu SCAN-komennosta toistamaan lajitellun joukon jäseniä. Koska ZSCAN-komento periytyy SCAN-komennosta, melkein kaikki toiminnot ovat samat kuin yleiskäyttöinen SCAN-komento.







Kuten annetussa kuvassa, SCAN-komento on kohdistinpohjainen iteraattori. Siksi Redis-kokoelman kaikkien kohteiden tarjoaminen vaatii yhden tai useamman iteroinnin. Koska ZSCAN-komento perii vanhempien SCAN-komennon, toiminta on sama. Tässä oppaassa käsitellään ZSCAN-komennon syntaksia ja käyttötapauksia yksityiskohtaisesti.



ZSCAN-komento

ZSCAN-komento on kohdistinpohjainen iteraattori, joka aloittaa iteroinnin 0. kohdistimella. Myöhemmin jokaisessa iteraatiossa se palauttaa nollan tai useampia lajiteltuja joukon jäseniä seuraavan kohdistimen kanssa, jota tulisi käyttää kohdistimena seuraavassa komentokutsussa. Jos palautettu kohdistin on 0 yhden tai useamman iteroinnin jälkeen, se tarkoittaa, että skannausprosessi on ohi. Kaikki lajitellut joukon jäsenet palautetaan tässä vaiheessa. Tätä prosessia kutsutaan täydelliseksi iteraatioksi. Kuten voit nähdä, ZSCAN-komento säilyttää tilansa vain käyttämällä kohdistinta, mikä johtaa rajoitettuun tilatietoisuuteen. Siksi seuraavat haitat liittyvät ZSCAN-komentoon.



  • Sama elementti voi palata useissa iteraatioissa.
  • Jos jäsen ei ole läsnä skannausprosessin alussa, on todennäköistä, että kyseistä jäsentä ei palauteta täyden iteraation aikana.

Lisäksi palautettujen jäsenten lukumäärästä ei ole takuuta. Joissakin tapauksissa, jos lajiteltu joukko on hyvin pieni, kaikki jäsenet voidaan palauttaa aivan ensimmäisessä iteraatiossa. Koska Redis käyttää erityistä yhden varauksen pakattua koodausmuotoa jäsenten säilyttämiseen, kunnes nimikkeiden enimmäismäärä saavutetaan. ZSCAN-komento voi palauttaa kohdistimen vain, jos skannattu tietorakenne on esitetty hash-taulukona.





Syntaksi:
ZSCAN-komento käyttää lähes samaa syntaksia kuin SCAN-komento, paitsi että se hyväksyy lajiteltua set-avainta ensimmäisenä argumenttina. Komennon syntaksi sallittujen argumenttien kanssa on seuraava:

ZSCAN sorted_set_key kohdistin [ MATCH kuvio ] [ COUNT jäsenmäärä ]

lajiteltu_set_avain : Lajitellun sarjan avain.
Kursori : Kohdistimen arvo alkaa 0:sta ja päättyy 0:aan, jos se on täysi iteraatio.



Seuraavat argumentit ovat valinnaisia:

OTTELU : Malli, joka sopii haettaessa elementtejä kussakin iteraatiossa. Vain vastaavat jäsenet palautetaan.
KREIVI : Jokaisessa iteraatiossa palautettavien jäsenten likimääräinen määrä.

Palautettu tulosjoukko per iteraatio sisältää pari elementtiä. Ensimmäinen osa on 64-bittinen etumerkitön kokonaisluku, joka edustaa seuraavaan kutsuun siirrettävää kohdistinta. Seuraava osa on joukko jäseniä ja niihin liittyviä pisteitä.

Käyttötapaus 1 – Hae kaikki verkkopelin jäsenet ja heidän suorittamansa tehtävät

Oletetaan, että online-peliyhtiö ylläpitää tulostaulukkoa käyttämällä Redis-lajiteltua sarjaa. Koska suuret käyttäjät pelaavat peliä aktiivisesti, he tarvitsevat tavan hakea jokainen pelaaja ja siihen liittyvät pisteet, jotka ovat suoritettujen tehtävien määrä. Haku on suoritettava ilman palvelimen estämistä. Joten suositus on käyttää ZSCAN-komentoa seuraavasti:

Ensin luodaan lajiteltu sarja, jossa on joitakin pelaajia ja suoritettuja tehtäviä.

zadd LeaderBoard 12 Pelaaja 6: John 4 Pelaaja2: Mary 22 Pelaaja1: Patel viisitoista Pelaaja: yksitoista 23 Pelaaja 5: Ann 30 Pelaaja 7: Kovaa 23 Pelaaja12: Abby kaksi Pelaaja 13: Nicky 6 Pelaaja 9: Jeremy 7 Pelaaja45: Kina

Nyt voimme iteroida lajitellun joukon jäseniä seuraavasti:

zscan LeaderBoard 0

Lähtö:

Kohdistimen arvo on 0 palautetussa tulosjoukossa, mikä tarkoittaa, että kaikki jäsenet palautetaan ensimmäisen iteraation lopussa. Tässä tapauksessa, koska jäsenten määrä on pieni, Redis edustaa näitä jäseniä yhden allokoinnin pakatulla koodauksella. Siksi komento palauttaa kaikki lajitellun joukon jäsenet, kunnes enimmäiskoko tai jäsenmäärä saavutetaan. Tätä kutsutaan täydelliseksi iteraatioksi. Koska ensimmäisen iteraation lopussa saamme kaikki kymmenen jäsentä ja heidän pistemääränsä. Jos meillä on satoja jäseniä, se esitetään muistissa hash-taulukona. Joten kaikkien jäsenten palauttaminen vaatii useita iteraatioita.

COUNT-parametria voidaan käyttää rajoittamaan iteraatiossa palautettujen jäsenten määrää. Oletusarvoisesti tämä argumentti on 10. Jos lajiteltu joukko koostuu sadoista jäsenistä, se esitetään muistissa olevalla hash-taulukolla. Palautettujen jäsenten määrä on siis noin kymmenen per iteraatio. COUNT-argumentin arvoa ei huomioida, jos lajiteltu joukko on liian pieni.

Käyttötapaus 2 – Hae pelaajat, joiden nimi alkaa kirjaimella 'J'

ZSCAN-komentoa voidaan käyttää palautettujen jäsenten suodattamiseen mallisovituksen perusteella. Siinä tapauksessa MATCH-argumentti on määritettävä.

Käytetään samaa esimerkkiä edellisestä käyttötapauksesta. Edellytyksenä on noutaa pelaajat, joiden nimi alkaa kirjaimella 'J'. Se on vain toteuttaa seuraava peliin liittyvä hieno ominaisuus. MATCH-argumentti voidaan määrittää seuraavasti:

zscan LeaderBoard 0 ottelu * J *

Tämän pitäisi ihannetapauksessa palauttaa kaksi jäsentä, joiden nimet ovat Jeremy ja John.

Johtopäätös

Yhteenvetona voidaan todeta, että ZSCAN-komentoa käytetään toistamaan Redis-lajiteltujen joukon jäseniä ja pisteitä. Tämä komento toimii samalla tavalla kuin SCAN-komento, paitsi että ZSCAN-komento hyväksyy set-avaimen ensimmäiseksi argumentiksi. Kuten käyttötapauksissa on kerrottu, ZSCAN-komentoa voidaan käyttää eri tavoin määrittämällä MATCH- ja COUNT-argumentit, joista voit hakea tiettyä mallia vastaavat jäsenet ja niihin liittyvät pisteet ja rajoittaa palautettua jäsenmäärää iteraatiota kohti. Kaiken kaikkiaan ZSCAN-komento voi olla hyödyllinen haettaessa järjestetyn joukon jäseniä palvelinta tai asiakasta estämättä.