Redis ZSCAN

Redis Zscan



Pakartokite surūšiuoto rinkinio narius

Kaip visi žinote, „Redis“ surūšiuoti rinkiniai yra išvesti iš įprastų rinkinių, kur kiekvienas narys yra surikiuotas pagal balo reikšmę didėjančia tvarka. Jei du ar daugiau narių turi tą pačią balo reikšmę, jie išdėstomi leksikografine tvarka. Paprastai narius ir balus galima gauti tiesiogiai naudojant ZRANGE komandą. Kai turite didelį surūšiuotą rinkinį su tūkstančiais narių, komanda ZRANGE gali užblokuoti serverį ilgam laikui, pavyzdžiui, komandos SMEMBERS ir KEYS, o tai yra trūkumas. Taigi, „Redis“ siūlo specialią komandą, vadinamą ZSCAN, kuri yra kilusi iš komandos SCAN, kad būtų galima kartoti surūšiuoto rinkinio narius. Kadangi komanda ZSCAN paveldima iš komandos SCAN, beveik visi veiksmai yra tokie patys kaip bendrosios paskirties SCAN komanda.







Kaip ir pateiktame paveikslėlyje, komanda SCAN yra žymekliu pagrįstas iteratorius. Taigi, norint pateikti visus „Redis“ kolekcijos elementus, reikia atlikti vieną ar daugiau iteracijų. Kadangi komanda ZSCAN paveldima iš pirminės SCAN komandos, elgsena yra tokia pati. Šiame vadove bus išsamiai aptarta ZSCAN komandos sintaksė ir naudojimo atvejai.



ZSCAN komanda

Komanda ZSCAN yra žymekliu pagrįstas iteratorius, kuris pradeda iteraciją nuo 0-ojo žymeklio. Vėliau kiekvienoje iteracijoje jis grąžina nulį arba daugiau surūšiuotų rinkinio narių kartu su kitu žymekliu, kuris turėtų būti naudojamas kaip sekančio komandos iškvietimo žymeklis. Jei po vienos ar kelių iteracijų grąžinamas žymeklis yra 0, tai reiškia, kad nuskaitymo procesas baigtas. Šiuo metu grąžinami visi surūšiuoti rinkinio nariai. Šis procesas vadinamas visa iteracija. Kaip matėte, komanda ZSCAN išlaiko savo būseną tik naudodama žymeklį, kuris lemia ribotą būsenos suvokimą. Todėl su ZSCAN komanda yra susiję šie trūkumai.



  • Tas pats elementas gali grįžti keliomis iteracijomis.
  • Jei nario nėra nuskaitymo proceso pradžioje, yra tikimybė, kad jis nebus grąžintas per visą iteraciją.

Be to, nėra garantijos dėl grąžintų narių skaičiaus. Kai kuriais atvejais, jei surūšiuotas rinkinys yra labai mažas, visi nariai gali būti grąžinti per pirmąją iteraciją. Kadangi Redis naudoja specialų vieno paskirstymo supakuotą kodavimo formatą, kad išlaikytų narius, kol pasiekiamas maksimalus elementų skaičius. Komanda ZSCAN gali grąžinti žymeklį tik tuo atveju, jei nuskaitytų duomenų struktūra pateikiama kaip maišos lentelė.





Sintaksė:
Komanda ZSCAN naudoja beveik tą pačią sintaksę kaip ir komanda SCAN, išskyrus tai, kad ji priima surūšiuotą rinkinio raktą kaip pirmąjį argumentą. Komandos sintaksė su leidžiamais argumentais yra tokia:

ZSCAN sorted_set_key žymeklis [ MATCH modelis ] [ COUNT narių skaičius ]

surūšiuotas_nustatymo_raktas : surūšiuoto rinkinio raktas.
Žymeklis : žymeklio reikšmė prasideda nuo 0 ir baigiasi 0, jei tai yra visa iteracija.



Šie argumentai yra neprivalomi:

MATCH : šablonas, kuris turi atitikti kiekvienos iteracijos elementus. Grąžinami tik suderinti nariai.
COUNT : apytikslis narių skaičius, kuris turi būti grąžintas kiekvienoje iteracijoje.

Grąžintame rezultatų rinkinyje per iteraciją yra keletas elementų. Pirmoji dalis yra 64 bitų sveikasis skaičius be ženklo, kuris žymi žymeklį, kuris turi būti perkeltas į kitą skambutį. Kita dalis yra narių ir susijusių balų rinkinys.

1 naudojimo atvejis – susigrąžinkite visus narius ir jų atliktas internetinio žaidimo užduotis

Tarkime, kad internetinių žaidimų įmonė išlaiko lyderių lentelę naudodama „Redis“ surūšiuotą rinkinį. Kadangi žaidimą aktyviai žaidžia didžiuliai vartotojai, jiems reikia būdo, kaip gauti kiekvieną žaidėją ir su juo susijusį rezultatą, kuris yra įvykdytų misijų skaičius. Būtina atlikti nuskaitymą neužblokuojant serverio. Taigi, rekomenduojama naudoti ZSCAN komandą taip:

Pirmiausia sukuriame surūšiuotą rinkinį su kai kuriais žaidėjais ir atliktų misijų skaičiumi.

zadd lyderių lenta 12 6 žaidėjas: Jonas 4 2 žaidėjas: Marija 22 1 žaidėjas: Patel penkiolika Žaidėjas: vienuolika 23 5 žaidėjas: Ann 30 7 žaidėjas: Atšiaurus 23 12 žaidėjas: abby du 13 žaidėjas: Nicky 6 9 žaidėjas: Jeremy 7 45 žaidėjas: Kina

Dabar galime pakartoti surūšiuoto rinkinio narius taip:

zscan LeaderBoard 0

Išvestis:

Grąžintame rezultatų rinkinyje žymeklio reikšmė yra 0, o tai reiškia, kad visi nariai grąžinami pirmosios iteracijos pabaigoje. Šiuo atveju, kadangi narių skaičius yra mažas, Redis atstovauja šiems nariams naudodama vieno paskirstymo supakuotą kodavimą. Todėl, kol nepasiekiamas maksimalus paketo dydis arba narių skaičius, komanda grąžina visus surūšiuoto rinkinio narius. Tai vadinama pilna iteracija. Nes pirmosios iteracijos pabaigoje gauname visus dešimt narių ir jų balus. Jei turime šimtus narių, tai atmintyje vaizduojama kaip maišos lentelė. Taigi, norint grąžinti visus narius, reikia kelių iteracijų.

Parametras COUNT gali būti naudojamas norint apriboti iteracijos metu grąžinamų narių skaičių. Pagal numatytuosius nustatymus šis argumentas yra 10. Jei surūšiuotą rinkinį sudaro šimtai narių, jis atmintyje pateikiamas maišos lentele. Taigi grąžintų narių skaičius yra apie dešimt per vieną iteraciją. Argumento COUNT reikšmė nepaisoma, jei surūšiuotas rinkinys yra per mažas.

2 naudojimo atvejis – gaukite žaidėjus, kurių vardas prasideda raide „J“

Komanda ZSCAN gali būti naudojama grąžinamiems nariams filtruoti pagal šablono atitiktį. Tokiu atveju reikia nurodyti MATCH argumentą.

Naudokime tą patį pavyzdį iš ankstesnio naudojimo atvejo. Reikalavimas – atsiimti žaidėjus, kurių vardas prasideda raide „J“. Tai tik norint įdiegti kitą puikią su žaidimu susijusią funkciją. MATCH argumentą galima nurodyti taip:

zscan LeaderBoard 0 rungtynės * J *

Idealiu atveju tai turėtų grąžinti du narius, kurių vardai yra Džeremis ir Džonas.

Išvada

Apibendrinant galima pasakyti, kad komanda ZSCAN naudojama pakartotinai perskaityti Redis surūšiuoto rinkinio narius ir balus. Ši komanda veikia taip pat, kaip komanda SCAN, išskyrus tai, kad komanda ZSCAN priima nustatymo raktą kaip pirmąjį argumentą. Kaip aptarta naudojimo atvejais, komanda ZSCAN gali būti naudojama įvairiais būdais, nurodant MATCH ir COUNT argumentus, kuriuose galite gauti narius ir susijusius balus, atitinkančius konkretų šabloną, ir apriboti grąžinamų narių skaičių per iteraciją. Apskritai komanda ZSCAN gali būti naudinga nuskaitant surūšiuoto rinkinio narius neužblokuojant serverio ar kliento.