Redis ZSCAN

Redis Zscan



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ő:

ZSCAN sorted_set_key kurzor [ MATCH minta ] [ COUNT tag_count ]

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: Kina

Most 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.