Redis ZSCAN

Redis Zscan



Итериране на членовете на сортирано множество

Както всички знаете, сортираните набори на Redis са получени от обикновените набори, където всеки член е подреден по стойността на резултата във възходящ ред. Ако два или повече члена притежават една и съща стойност на резултата, те се подреждат по лексикографски ред. Обикновено членовете и резултатите могат да бъдат директно извлечени с помощта на командата ZRANGE. Когато имате голям сортиран набор с хиляди членове, командата ZRANGE може да блокира сървъра за дълго време като командите SMEMBERS и KEYS, което е недостатък. И така, Redis предлага специална команда, наречена ZSCAN, която е извлечена от командата SCAN за итерация на членовете на сортиран набор. Тъй като командата ZSCAN наследява от командата SCAN, почти всички поведения са същите като командата SCAN с общо предназначение.







Както на дадената фигура, командата SCAN е базиран на курсора итератор. Следователно са необходими една или повече итерации, за да се осигурят всички елементи от Redis колекция. Тъй като командата ZSCAN наследява от родителската команда SCAN, поведението е същото. В това ръководство синтаксисът и случаите на използване на командата ZSCAN ще бъдат обсъдени подробно.



Командата ZSCAN

Командата ZSCAN е базиран на курсор итератор, който започва итерацията с 0-ия курсор. След това, при всяка итерация, той връща нула или повече сортирани членове на набора заедно със следващия курсор, който трябва да се използва като курсор за следващото извикване на команда. Ако върнатият курсор е 0 след една или повече итерации, това означава, че процесът на сканиране е приключил. В този момент се връщат всички сортирани членове на набора. Този процес се нарича пълна итерация. Както можете да видите, командата ZSCAN запазва състоянието си само с помощта на курсор, което води до ограничено осъзнаване на състоянието. Следователно следните недостатъци са свързани с командата ZSCAN.



  • Същият елемент може да се върне в множество итерации.
  • Ако даден член не присъства в началото на процеса на сканиране, има вероятност този член да не бъде върнат по време на пълна итерация.

Освен това няма гаранция за броя на върнатите членове. В някои случаи, ако сортираният набор е много малък, всички членове може да бъдат върнати още в първата итерация. Тъй като Redis използва специален формат за кодиране, пакетиран с единично разпределение, за да задържи членовете до достигане на максимален брой елементи. Командата ZSCAN може да върне курсор само ако структурата на сканираните данни е представена като хеш таблица.





Синтаксис:
Командата ZSCAN използва почти същия синтаксис като командата SCAN, с изключение на това, че приема сортиран зададен ключ като първи аргумент. Синтаксисът на командата с разрешените аргументи е както следва:

ZSCAN sorted_set_key курсор [ MATCH модел ] [ COUNT Member_count ]

sorted_set_key : Ключът на сортирания набор.
Курсор : Стойността на курсора започва от 0 и завършва на 0, ако е пълна итерация.



Следните аргументи не са задължителни:

СЪВПАДА : Модел за съвпадение при извличане на елементите във всяка итерация. Връщат се само съответстващите членове.
БРОЯ : Приблизителният брой членове, които трябва да бъдат върнати във всяка итерация.

Върнатият набор от резултати на итерация съдържа няколко елемента. Първата част е 64-битово цяло число без знак, което представлява курсора, който ще бъде предаден в следващото извикване. Следващата част е масив от членове и свързани резултати.

Случай на използване 1 – Извличане на всички членове и техните изпълнени мисии на онлайн игра

Да приемем, че компания за онлайн игри поддържа класация, използвайки сортирания набор на Redis. Тъй като масовите потребители играят активно играта, те се нуждаят от начин да извлекат всеки играч и свързания с него резултат, който е броят на изпълнените мисии. Задължително е да извършите извличането без блокиране на сървъра. Така че препоръката е да използвате командата ZSCAN, както следва:

Първо създаваме сортиран комплект с някои играчи и изпълнения брой мисии.

zadd класация 12 Играч6: Джон 4 Играч2: Мери 22 Играч1: Пател петнадесет играч: единадесет 23 Играч 5: Ан 30 Играч 7: Сурово 23 Играч12: аби две Играч 13: Ники 6 Играч 9: Джереми 7 Играч45: Кина

Сега можем да повторим членовете на сортирания набор, както следва:

zscan класация 0

Изход:

Стойността на курсора е 0 в върнатия набор от резултати, което означава, че всички членове се връщат в края на първата итерация. В този случай, тъй като броят на членовете е малък, Redis представя тези членове с помощта на пакетирано кодиране с едно разпределение. Следователно, докато не бъде достигнат максимален размер на пакета или брой членове, командата връща всички членове в сортирания набор. Това се нарича пълна итерация. Тъй като в края на първата итерация получаваме всичките десет члена и техните резултати. Ако имаме стотици членове, това се представя като хеш таблица в паметта. Така че са необходими няколко повторения, за да се върнат всички членове.

Параметърът COUNT може да се използва за ограничаване на броя на членовете, върнати в итерация. По подразбиране този аргумент е зададен на 10. Ако сортираният набор се състои от стотици членове, той се представя от хеш таблица в паметта. И така, броят на върнатите членове е около десет на итерация. Стойността на аргумента COUNT се игнорира, ако сортираният набор е твърде малък.

Случай на използване 2 – Извлечете играчите, чието име започва с буквата „J“

Командата ZSCAN може да се използва за филтриране на върнатите членове въз основа на съвпадение на шаблон. В този случай трябва да се посочи аргументът MATCH.

Нека използваме същия пример от предишния случай на употреба. Изискването е да вземете играчите, чието име започва с буквата „J“. Това е само за внедряване на следващата страхотна функция, свързана с играта. Аргументът MATCH може да бъде определен по следния начин:

zscan класация 0 съвпада * Дж *

В идеалния случай това трябва да върне двама членове, чиито имена са Jeremy и John.

Заключение

В обобщение, командата ZSCAN се използва за итерация на членовете и резултатите на сортиран Redis набор. Тази команда се държи по същия начин като командата SCAN, с изключение на това, че командата ZSCAN приема зададения ключ като първи аргумент. Както беше обсъдено в случаите на използване, командата ZSCAN може да се използва по различни начини чрез указване на аргументите MATCH и COUNT, където можете да извлечете членовете и свързаните резултати, които съответстват на конкретен модел и да ограничите върнатия брой членове за итерация. Като цяло командата ZSCAN може да бъде полезна при извличане на членовете на сортиран набор, без да блокира сървъра или клиента.