Redis ZSCAN

Redis Zscan



Herhaal de leden van een gesorteerde set

Zoals jullie allemaal weten, zijn Redis-gesorteerde sets afgeleid van de reguliere sets waarbij elk lid is gerangschikt op zijn scorewaarde in oplopende volgorde. Als twee of meer leden dezelfde scorewaarde hebben, worden ze gerangschikt op lexicografische volgorde. Meestal kunnen de leden en partituren direct worden opgehaald met het ZRANGE-commando. Als je een grote gesorteerde set hebt met duizenden leden, kan het ZRANGE-commando de server voor een lange tijd blokkeren, zoals de SMEMBERS- en KEYS-commando's, wat een nadeel is. Redis biedt dus een speciaal commando genaamd ZSCAN dat is afgeleid van het SCAN-commando om de leden van een gesorteerde set te herhalen. Aangezien het ZSCAN-commando erft van het SCAN-commando, is bijna al het gedrag hetzelfde als het SCAN-commando voor algemene doeleinden.







Zoals in de gegeven afbeelding is de SCAN-opdracht een op cursor gebaseerde iterator. Er zijn dus een of meer iteraties nodig om alle items van een Redis-verzameling te leveren. Aangezien het ZSCAN-commando erft van het bovenliggende SCAN-commando, is het gedrag hetzelfde. In deze handleiding worden de syntaxis en gebruiksscenario's van het ZSCAN-commando in detail besproken.



Het ZSCAN-commando

De opdracht ZSCAN is een op cursor gebaseerde iterator die de iteratie start met de 0e cursor. Daarna, in elke iteratie, retourneert het nul of meer gesorteerde setleden samen met de volgende cursor die moet worden gebruikt als de cursor voor de volgende opdrachtaanroep. Als de geretourneerde cursor na een of meer iteraties 0 is, betekent dit dat het scanproces voorbij is. Alle gesorteerde setleden worden op dit punt geretourneerd. Dit proces wordt een volledige iteratie genoemd. Zoals je kon zien, behoudt het ZSCAN-commando zijn status alleen met behulp van een cursor, wat leidt tot een beperkt statusbewustzijn. Daarom zijn de volgende nadelen verbonden aan het ZSCAN-commando.



  • Hetzelfde element kan in meerdere iteraties terugkeren.
  • Als een lid niet aanwezig is aan het begin van het scanproces, bestaat de kans dat dat lid tijdens een volledige iteratie niet wordt geretourneerd.

Bovendien is er geen garantie op het aantal teruggekeerde leden. In sommige gevallen, als de gesorteerde set erg klein is, kunnen alle leden in de allereerste iteratie worden geretourneerd. Omdat Redis een speciaal coderingsformaat met enkele toewijzing gebruikt om de leden vast te houden totdat een maximum aantal items is bereikt. Het ZSCAN-commando kan alleen een cursor retourneren als de gescande gegevensstructuur wordt weergegeven als een hashtabel.





Syntaxis:
Het ZSCAN-commando gebruikt bijna dezelfde syntaxis als het SCAN-commando, behalve dat het een gesorteerde set-sleutel als het eerste argument accepteert. De opdrachtsyntaxis met de toegestane argumenten is als volgt:

ZSCAN sort_set_key cursor [ MATCH patroon ] [ COUNT ledenaantal ]

gesorteerd_set_key : De sleutel van de gesorteerde set.
Cursor : De cursorwaarde begint bij 0 en eindigt bij 0 als het een volledige iteratie is.



De volgende argumenten zijn optioneel:

WEDSTRIJD : Een patroon dat overeenkomt bij het ophalen van de elementen in elke iteratie. Alleen de overeenkomende leden worden geretourneerd.
GRAAF : Het geschatte aantal leden dat in elke iteratie moet worden geretourneerd.

De geretourneerde resultatenset per iteratie bevat een aantal elementen. Het eerste deel is een 64-bits geheel getal zonder teken dat de cursor vertegenwoordigt die moet worden doorgegeven aan de volgende aanroep. Het volgende deel is een reeks leden en bijbehorende partituren.

Use Case 1 – Vind alle leden en hun voltooide missies van een online game

Laten we aannemen dat een online gamebedrijf een leaderboard bijhoudt met behulp van de Redis-gesorteerde set. Omdat massale gebruikers het spel actief spelen, hebben ze een manier nodig om elke speler en hun bijbehorende score op te halen, het aantal voltooide missies. Het is een must om het ophalen uit te voeren zonder de server te blokkeren. De aanbeveling is dus om het ZSCAN-commando als volgt te gebruiken:

Eerst maken we een gesorteerde set met enkele spelers en het voltooide aantal missies.

zadd LeaderBoard 12 Speler6:John 4 Speler2:Mary 22 Speler1:Patel vijftien Speler: elf 23 Speler5:Ann 30 Speler7:Hars 23 Speler12:abby twee Speler13:Nicky 6 Speler9:Jeremy 7 Speler45:Kina

Nu kunnen we de leden van de gesorteerde set als volgt herhalen:

zscan LeaderBoard 0

Uitgang:

De cursorwaarde is 0 in de geretourneerde resultaatset, wat betekent dat alle leden aan het einde van de eerste iteratie worden geretourneerd. In dit geval, omdat het aantal leden klein is, vertegenwoordigt Redis deze leden met behulp van een enkelvoudige toewijzing verpakte codering. Daarom retourneert de opdracht alle leden in de gesorteerde set totdat een maximale verpakkingsgrootte of ledenaantal is bereikt. Dit wordt een volledige iteratie genoemd. Omdat we aan het einde van de eerste iteratie alle tien leden en hun scores ontvangen. Als we honderden leden hebben, wordt deze in het geheugen weergegeven als een hashtabel. Er zijn dus verschillende iteraties nodig om alle leden te retourneren.

De parameter COUNT kan worden gebruikt om het aantal leden te beperken dat in een iteratie wordt geretourneerd. Standaard is dit argument ingesteld op 10. Als de gesorteerde set uit honderden leden bestaat, wordt deze weergegeven door een hashtabel in het geheugen. Het aantal geretourneerde leden is dus ongeveer tien per iteratie. De waarde van het COUNT-argument wordt genegeerd als de gesorteerde set te klein is.

Use Case 2 - Haal de spelers op wiens naam begint met de letter 'J'

De opdracht ZSCAN kan worden gebruikt om de geretourneerde leden uit te filteren op basis van een patroonovereenkomst. In dat geval moet het MATCH-argument worden opgegeven.

Laten we hetzelfde voorbeeld uit de vorige use-case gebruiken. De vereiste is om de spelers op te halen wiens naam begint met de letter 'J'. Het is gewoon om de volgende coole functie met betrekking tot het spel te implementeren. Het MATCH-argument kan als volgt worden gespecificeerd:

zscan LeaderBoard 0 wedstrijd * J *

Dit zou idealiter twee leden moeten opleveren wiens namen Jeremy en John zijn.

Conclusie

Samengevat wordt het ZSCAN-commando gebruikt om de leden en scores van een Redis-gesorteerde set te herhalen. Dit commando gedraagt ​​zich hetzelfde als het SCAN-commando, behalve dat het ZSCAN-commando de set-sleutel als het eerste argument accepteert. Zoals besproken in de use-cases, kan het ZSCAN-commando op verschillende manieren worden gebruikt door de MATCH- en COUNT-argumenten op te geven waar u de leden en bijbehorende scores kunt ophalen die overeenkomen met een specifiek patroon en het aantal geretourneerde leden per iteratie kunt beperken. Over het algemeen kan het ZSCAN-commando handig zijn bij het ophalen van de leden van een gesorteerde set zonder de server of client te blokkeren.