Iteráljon egy rendezett halmaz tagjai felett
Mint mindenki tudja, a Redis rendezett halmazai a normál halmazokból származnak, ahol az egyes tagok pontszámértéke szerint vannak rendezve növekvő sorrendben. Ha két vagy több tag azonos pontszámmal rendelkezik, akkor lexikográfiai sorrendben vannak rendezve. Általában a tagok és pontszámok közvetlenül lekérhetők a ZRANGE paranccsal. Ha nagy, több ezer tagot tartalmazó készlettel rendelkezik, a ZRANGE parancs hosszú időre blokkolhatja a szervert, mint például a SMEMBERS és a KEYS parancsok, ami hátrány. Tehát a Redis egy speciális, ZSCAN nevű parancsot kínál, amely a SCAN parancsból származik, hogy egy rendezett halmaz tagjain át ismételjen. Mivel a ZSCAN parancs a SCAN parancsot örökli, szinte minden viselkedés megegyezik az általános célú SCAN parancséval.
Ahogy az ábrán is látható, a SCAN parancs egy kurzor alapú iterátor. Ezért egy vagy több iterációra van szükség a Redis-gyűjtemény összes elemének biztosításához. Mivel a ZSCAN parancs a szülő SCAN parancstól örökli, a viselkedés ugyanaz. Ebben az útmutatóban részletesen tárgyaljuk a ZSCAN parancs szintaxisát és használati eseteit.
A ZSCAN Parancsnokság
A ZSCAN parancs egy kurzor alapú iterátor, amely az iterációt a 0. kurzorral kezdi. Ezt követően minden iterációban nulla vagy több rendezett halmaztagot ad vissza a következő kurzorral együtt, amelyet a következő parancshívás kurzoraként kell használni. Ha a visszaadott kurzor egy vagy több iteráció után 0, az azt jelenti, hogy a vizsgálati folyamat véget ért. Ezen a ponton az összes rendezett halmaztag visszakerül. Ezt a folyamatot teljes iterációnak nevezzük. Amint láthatta, a ZSCAN parancs csak egy kurzor használatával tartja meg állapotát, ami korlátozott állapottudathoz vezet. Ezért a következő hátrányok kapcsolódnak a ZSCAN parancshoz.
- Ugyanaz az elem több iterációban is visszatérhet.
- Ha egy tag nincs jelen a vizsgálati folyamat elején, előfordulhat, hogy a teljes iteráció során nem adja vissza azt a tagot.
Ráadásul a visszatért tagok számára nincs garancia. Bizonyos esetekben, ha a rendezett halmaz nagyon kicsi, előfordulhat, hogy az összes tag visszakerül a legelső iterációban. Mivel a Redis egy speciális, egyszeri kiosztással csomagolt kódolási formátumot használ a tagok megtartására, amíg el nem éri a maximális tételszámot. A ZSCAN parancs csak akkor tud kurzort visszaadni, ha a vizsgált adatstruktúra hash-táblaként van ábrázolva.
Szintaxis:
A ZSCAN parancs szinte ugyanazt a szintaxist használja, mint a SCAN parancs, kivéve, hogy első argumentumként egy rendezett set kulcsot fogad el. A parancs szintaxisa az engedélyezett argumentumokkal a következő:
sorted_set_key : A rendezett készlet kulcsa.
Kurzor : A kurzor értéke 0-val kezdődik és 0-val végződik, ha teljes iterációról van szó.
A következő argumentumok nem kötelezőek:
MÉRKŐZÉS : Egy minta, amely illeszkedik az egyes iterációk elemeinek lekérésekor. Csak az egyező tagok kerülnek vissza.
SZÁMOL : Az egyes iterációk során visszaküldendő tagok hozzávetőleges száma.
Az iterációnként visszaadott eredményhalmaz néhány elemet tartalmaz. Az első rész egy 64 bites előjel nélküli egész szám, amely a következő hívásba átadandó kurzort jelöli. A következő rész a tagok és a hozzájuk tartozó pontszámok tömbje.
1. használati eset – Egy online játék összes tagjának és teljesített küldetésének visszakeresése
Tegyük fel, hogy egy online játékokkal foglalkozó cég a Redis rendezett készlet használatával vezet ranglistát. Mivel nagyszámú felhasználó játszik aktívan a játékkal, szükségük van egy módra az egyes játékosok és a hozzájuk tartozó pontszámok lekérésére, ami a teljesített küldetések száma. A visszakeresést a szerver blokkolása nélkül kell végrehajtani. Tehát a ZSCAN parancs használata a következőképpen javasolt:
Először is létrehozunk egy rendezett készletet néhány játékossal és a teljesített küldetések számával.
zadd LeaderBoard 12 6. játékos: János 4 2. játékos: Mária 22 1. játékos: Patel tizenöt Játékos: tizenegy 23 5. játékos: Ann 30 7. játékos: Kemény 23 Játékos12:abby két 13. játékos: Nicky 6 9. játékos: Jeremy 7 45. játékos: KinaMost a következőképpen iterálhatjuk a rendezett halmaz tagjait:
zscan LeaderBoard 0 Kimenet:
A kurzor értéke 0 a visszaadott eredményhalmazban, ami azt jelenti, hogy az összes tag visszakerül az első iteráció végén. Ebben az esetben, mivel a tagok száma kicsi, a Redis ezeket a tagokat egyszeri kiosztású csomagolt kódolással reprezentálja. Ezért, amíg el nem éri a maximális csomagméretet vagy a tagok számát, a parancs visszaadja a rendezett halmaz összes tagját. Ezt nevezzük teljes iterációnak. Mert az első iteráció végén megkapjuk mind a tíz tagot és azok pontszámait. Ha több száz tagunk van, akkor ez hash táblaként jelenik meg a memóriában. Tehát több iterációra van szükség az összes tag visszaadásához.
A COUNT paraméterrel korlátozható az iteráció során visszaadott tagok száma. Alapértelmezés szerint ez az argumentum 10. Ha a rendezett halmaz több száz tagból áll, akkor azt egy hash tábla képviseli a memóriában. Tehát a visszaküldött tagok száma iterációnként tíz körül van. A COUNT argumentum értékét figyelmen kívül hagyja, ha a rendezett halmaz túl kicsi.
2. használati eset – Hozza le azokat a játékosokat, akiknek a neve „J” betűvel kezdődik
A ZSCAN paranccsal kiszűrhető a visszaadott tagok mintaegyeztetés alapján. Ebben az esetben meg kell adni a MATCH argumentumot.
Használjuk ugyanazt a példát az előző használati esetből. A követelmény az, hogy azokat a játékosokat hozzuk le, akiknek neve „J” betűvel kezdődik. Ez csak a játékhoz kapcsolódó következő nagyszerű funkció megvalósítása. A MATCH argumentum a következőképpen adható meg:
zscan LeaderBoard 0 mérkőzés * J *Ideális esetben két tagot kell visszaadnia, akiknek neve Jeremy és John.
Következtetés
Összefoglalva, a ZSCAN parancsot a Redis rendezett halmaz tagjainak és pontszámainak iterálására használják. Ez a parancs ugyanúgy működik, mint a SCAN parancs, kivéve, hogy a ZSCAN parancs elfogadja a set kulcsot első argumentumként. A használati eseteknél tárgyaltak szerint a ZSCAN parancs többféleképpen használható a MATCH és COUNT argumentumok megadásával, ahol lekérheti az adott mintának megfelelő tagokat és kapcsolódó pontszámokat, és korlátozhatja a visszaadott tagok számát iterációnként. Összességében a ZSCAN parancs hasznos lehet egy rendezett halmaz tagjainak lekérésekor a szerver vagy az ügyfél blokkolása nélkül.