Redis ZSCAN

Redis Zscan



Iterera över medlemmarna i en sorterad uppsättning

Som ni alla vet härleds Redis-sorterade set från de vanliga seten där varje medlem är sorterad efter sitt poängvärde i stigande ordning. Om två eller flera medlemmar har samma poängvärde, ordnas de i lexikografisk ordning. Vanligtvis kan medlemmarna och poängen hämtas direkt med kommandot ZRANGE. När du har en stor sorterad uppsättning med tusentals medlemmar, kan ZRANGE-kommandot blockera servern under lång tid som SMEMBERS och KEYS-kommandona, vilket är en nackdel. Så, Redis erbjuder ett speciellt kommando som kallas ZSCAN som härrör från kommandot SCAN för att iterera över medlemmarna i en sorterad uppsättning. Eftersom ZSCAN-kommandot ärver från SCAN-kommandot är nästan alla beteenden desamma som SCAN-kommandot för allmänna ändamål.







Som i den givna bilden är SCAN-kommandot en markörbaserad iterator. Därför krävs det en eller flera iterationer för att tillhandahålla alla föremål i en Redis-samling. Eftersom ZSCAN-kommandot ärver från det överordnade SCAN-kommandot är beteendet detsamma. I den här guiden kommer syntaxen och användningsfallen för ZSCAN-kommandot att diskuteras i detalj.



ZSCAN-kommandot

ZSCAN-kommandot är en markörbaserad iterator som startar iterationen med den 0:e markören. Efteråt, i varje iteration, returnerar den noll eller fler sorterade uppsättningsmedlemmar tillsammans med nästa markör som ska användas som markör för följande kommandoanrop. Om den returnerade markören är 0 efter en eller flera iterationer betyder det att skanningsprocessen är över. Alla sorterade uppsättningsmedlemmar returneras vid denna tidpunkt. Denna process kallas en fullständig iteration. Som du kunde se, behåller kommandot ZSCAN sitt tillstånd endast med hjälp av en markör, vilket leder till en begränsad tillståndsmedvetenhet. Därför är följande nackdelar associerade med ZSCAN-kommandot.



  • Samma element kan återkomma i flera iterationer.
  • Om en medlem inte är närvarande i början av skanningsprocessen, finns det en sannolikhet att inte returnera den medlemmen under en fullständig iteration.

Dessutom finns det ingen garanti för de återvändande medlemmarna. I vissa fall, om den sorterade uppsättningen är mycket liten, kan alla medlemmar returneras i den allra första iterationen. Eftersom Redis använder ett speciellt kodningsformat med enkel allokering för att hålla medlemmarna tills ett maximalt antal objekt har uppnåtts. ZSCAN-kommandot kan endast returnera en markör om den skannade datastrukturen representeras som en hashtabell.





Syntax:
ZSCAN-kommandot använder nästan samma syntax som SCAN-kommandot förutom att det accepterar en sorterad uppsättningsnyckel som det första argumentet. Kommandosyntaxen med de tillåtna argumenten är som följer:

ZSCAN sorted_set_key cursor [ MATCH mönster ] [ COUNT medlemsantal ]

sorted_set_key : Nyckeln för den sorterade uppsättningen.
Markör : Markörvärdet börjar från 0 och slutar på 0 om det är en hel iteration.



Följande argument är valfria:

MATCH : Ett mönster att matcha när elementen i varje iteration hämtas. Endast de matchade medlemmarna returneras.
RÄKNA : Det ungefärliga antalet medlemmar som ska returneras i varje iteration.

Den returnerade resultatuppsättningen per iteration innehåller ett par element. Den första delen är ett 64-bitars osignerat heltal som representerar markören som ska skickas till nästa anrop. Nästa del är en rad medlemmar och tillhörande poäng.

Användningsfall 1 – Hämta alla medlemmar och deras slutförda uppdrag i ett onlinespel

Låt oss anta att ett onlinespelsföretag har en topplista med hjälp av Redis-sorterade set. Eftersom stora användare aktivt spelar spelet behöver de ett sätt att hämta varje spelare och deras tillhörande poäng, vilket är antalet genomförda uppdrag. Det är ett måste att utföra hämtningen utan att blockera servern. Så, rekommendationen är att använda ZSCAN-kommandot enligt följande:

Först skapar vi ett sorterat set med några spelare och det slutförda antalet uppdrag.

zadd Leaderboard 12 Spelare 6: John 4 Spelare 2: Mary 22 Spelare 1: Patel femton Spelare: elva 23 Spelare 5: Ann 30 Spelare 7: Hård 23 Spelare 12:abby två Spelare 13: Nicky 6 Spelare 9: Jeremy 7 Spelare 45: Kina

Nu kan vi iterera över medlemmarna i den sorterade uppsättningen enligt följande:

zscan Leaderboard 0

Produktion:

Markörvärdet är 0 i den returnerade resultatuppsättningen, vilket innebär att alla medlemmar returneras i slutet av den första iterationen. I det här fallet, eftersom antalet medlemmar är litet, representerar Redis dessa medlemmar med hjälp av en kodning med en allokering. Därför, tills en maximal förpackningsstorlek eller medlemsantal uppnås, returnerar kommandot alla medlemmar i den sorterade uppsättningen. Detta kallas en fullständig iteration. För i slutet av den första iterationen får vi alla tio medlemmar och deras poäng. Om vi ​​har hundratals medlemmar representeras den som en hashtabell i minnet. Så det tar flera iterationer för att returnera alla medlemmar.

Parametern COUNT kan användas för att begränsa antalet medlemmar som returneras i en iteration. Som standard är detta argument satt till 10. Om den sorterade uppsättningen består av hundratals medlemmar, representeras den av en hashtabell i minnet. Så antalet returnerade medlemmar är cirka tio per iteration. Värdet på argumentet COUNT ignoreras om den sorterade uppsättningen är för liten.

Användningsfall 2 – Hämta spelarna vars namn börjar med bokstaven 'J'

ZSCAN-kommandot kan användas för att filtrera bort de returnerade medlemmarna baserat på en mönstermatchning. I så fall måste MATCH-argumentet anges.

Låt oss använda samma exempel från det tidigare användningsfallet. Kravet är att hämta de spelare vars namn börjar med bokstaven 'J'. Det är bara att implementera nästa coola funktion relaterad till spelet. Argumentet MATCH kan specificeras enligt följande:

zscan Leaderboard 0 match * J *

Detta bör helst returnera två medlemmar vars namn är Jeremy och John.

Slutsats

Sammanfattningsvis används ZSCAN-kommandot för att iterera över medlemmarna och poängen i en Redis-sorterad uppsättning. Detta kommando fungerar på samma sätt som SCAN-kommandot, förutom att ZSCAN-kommandot accepterar set-nyckeln som det första argumentet. Som diskuterats i användningsfallen kan ZSCAN-kommandot användas på olika sätt genom att specificera MATCH- och COUNT-argumenten där du kan hämta medlemmarna och associerade poäng som matchar ett specifikt mönster och begränsa antalet returnerade medlemmar per iteration. Sammantaget kan ZSCAN-kommandot vara användbart när du hämtar medlemmarna i en sorterad uppsättning utan att blockera servern eller klienten.