Redis ZSCAN

Redis Zscan



Ulitin ang Mga Miyembro ng Pinagsunod-sunod na Set

Tulad ng alam mo lahat, ang Redis sorted sets ay hinango mula sa mga regular na set kung saan ang bawat miyembro ay inayos ayon sa value ng score nito sa pataas na pagkakasunud-sunod. Kung dalawa o higit pang miyembro ang nagtataglay ng parehong halaga ng marka, inayos ang mga ito ayon sa pagkakasunud-sunod ng leksikograpikal. Karaniwan, ang mga miyembro at mga marka ay maaaring direktang makuha gamit ang ZRANGE command. Kapag mayroon kang isang malaking pinagsunod-sunod na set na may libu-libong miyembro, maaaring harangan ng ZRANGE command ang server sa mahabang panahon tulad ng SMEMBERS at KEYS command na isang disbentaha. Kaya, nag-aalok ang Redis ng isang espesyal na utos na tinatawag na ZSCAN na nagmula sa utos ng SCAN upang umulit sa mga miyembro ng isang pinagsunod-sunod na hanay. Dahil ang utos ng ZSCAN ay nagmana mula sa utos ng SCAN, halos lahat ng mga pag-uugali ay pareho sa pangkalahatang layunin na utos ng SCAN.







Tulad ng ibinigay na figure, ang SCAN command ay isang cursor-based iterator. Samakatuwid, kailangan ng isa o higit pang mga pag-ulit upang maibigay ang lahat ng mga item ng isang koleksyon ng Redis. Dahil ang ZSCAN command ay nagmana mula sa parent SCAN command, ang pag-uugali ay pareho. Sa gabay na ito, tatalakayin nang detalyado ang syntax at use cases ng ZSCAN command.



Ang Utos ng ZSCAN

Ang utos ng ZSCAN ay isang iterator na nakabatay sa cursor na nagsisimula sa pag-ulit gamit ang ika-0 na cursor. Pagkatapos, sa bawat pag-ulit, ibinabalik nito ang zero o higit pang mga nakaayos na set na miyembro kasama ang susunod na cursor na dapat gamitin bilang cursor para sa sumusunod na command call. Kung ang ibinalik na cursor ay 0 pagkatapos ng isa o higit pang mga pag-ulit, nangangahulugan ito na tapos na ang proseso ng pag-scan. Ang lahat ng pinagsunod-sunod na miyembro ng set ay ibinalik sa puntong ito. Ang prosesong ito ay tinatawag na isang buong pag-ulit. Tulad ng nakikita mo, pinapanatili ng utos ng ZSCAN ang estado nito gamit lamang ang isang cursor na humahantong sa isang limitadong kamalayan ng estado. Samakatuwid, ang mga sumusunod na disbentaha ay nauugnay sa utos ng ZSCAN.



  • Ang parehong elemento ay maaaring bumalik sa maraming pag-ulit.
  • Kung ang isang miyembro ay wala sa simula ng proseso ng pag-scan, may posibilidad na hindi ibalik ang miyembrong iyon sa panahon ng buong pag-ulit.

Bilang karagdagan, walang garantiya sa bilang ng mga bumalik na miyembro. Sa ilang mga kaso, kung ang pinagsunod-sunod na hanay ay napakaliit, ang lahat ng mga miyembro ay maaaring ibalik sa pinakaunang pag-ulit. Dahil ang Redis ay gumagamit ng espesyal na solong allocation na naka-pack na encoding na format para hawakan ang mga miyembro hanggang sa maabot ang maximum na bilang ng item. Ang ZSCAN command ay makakapagbalik lamang ng cursor kung ang na-scan na istraktura ng data ay kinakatawan bilang isang hash table.





Syntax:
Ang utos ng ZSCAN ay gumagamit ng halos kaparehong syntax gaya ng utos ng SCAN maliban na tinatanggap nito ang isang pinagsunod-sunod na set key bilang unang argumento. Ang command syntax na may mga pinapayagang argumento ay ang mga sumusunod:

ZSCAN sorted_set_key cursor [ MATCH pattern ] [ COUNT miyembro_bilang ]

sorted_set_key : Ang susi ng pinagsunod-sunod na hanay.
Cursor : Ang halaga ng cursor ay nagsisimula sa 0 at nagtatapos sa 0 kung ito ay isang buong pag-ulit.



Ang mga sumusunod na argumento ay opsyonal:

MATCH : Isang pattern na itugma kapag kinukuha ang mga elemento sa bawat pag-ulit. Ang mga katugmang miyembro lamang ang ibinabalik.
COUNT : Ang tinatayang bilang ng mga miyembro na ibabalik sa bawat pag-ulit.

Ang ibinalik na set ng resulta sa bawat pag-ulit ay naglalaman ng ilang elemento. Ang unang bahagi ay isang 64-bit unsigned integer na kumakatawan sa cursor na ipapasa sa susunod na tawag. Ang susunod na bahagi ay isang hanay ng mga miyembro at nauugnay na mga marka.

Gamitin ang Case 1 – Kunin ang Lahat ng Miyembro at ang Kanilang Nakumpletong Misyon ng isang Online na Laro

Ipagpalagay natin na ang isang online game company ay nagpapanatili ng isang leaderboard gamit ang Redis sorted set. Dahil aktibong naglalaro ng laro ang napakalaking user, kailangan nila ng paraan para makuha ang bawat manlalaro at ang kanilang nauugnay na marka na siyang bilang ng mga natapos na misyon. Ito ay kinakailangan upang maisagawa ang pagkuha nang hindi hinaharangan ang server. Kaya, ang rekomendasyon ay gamitin ang ZSCAN command tulad ng sumusunod:

Una, gumawa kami ng pinagsunod-sunod na set na may ilang manlalaro at ang nakumpletong bilang ng mga misyon.

zadd Leaderboard 12 Manlalaro6: John 4 Manlalaro2: Maria 22 Manlalaro1: Patel labinlima Manlalaro: labing-isa 23 Manlalaro5: Ann 30 Manlalaro7: Malupit 23 Manlalaro12:abby dalawa Manlalaro13:Nicky 6 Manlalaro9: Jeremy 7 Manlalaro45:Kina

Ngayon, maaari tayong umulit sa mga miyembro ng pinagsunod-sunod na hanay tulad ng sumusunod:

zscan LeaderBoard 0

Output:

Ang halaga ng cursor ay 0 sa ibinalik na set ng resulta na nangangahulugan na ang lahat ng mga miyembro ay ibinalik sa dulo ng unang pag-ulit. Sa kasong ito, dahil maliit ang bilang ng mga miyembro, kinakatawan ng Redis ang mga miyembrong ito gamit ang isang solong-allocation na naka-pack na encoding. Samakatuwid, hanggang sa maabot ang maximum na laki ng pack o bilang ng miyembro, ibabalik ng command ang lahat ng miyembro sa pinagsunod-sunod na hanay. Ito ay tinatawag na isang buong pag-ulit. Dahil sa pagtatapos ng unang pag-ulit, natatanggap namin ang lahat ng sampung miyembro at ang kanilang mga marka. Kung mayroon tayong daan-daang miyembro, kinakatawan ito bilang hash table sa memorya. Kaya, kailangan ng ilang mga pag-ulit upang maibalik ang lahat ng mga miyembro.

Maaaring gamitin ang COUNT parameter upang limitahan ang bilang ng mga miyembrong ibinalik sa isang pag-ulit. Bilang default, ang argumentong ito ay nakatakda sa 10. Kung ang pinagsunod-sunod na hanay ay binubuo ng daan-daang miyembro, ito ay kinakatawan ng isang hash table sa memorya. Kaya, ang bilang ng mga bumalik na miyembro ay humigit-kumulang sampu bawat pag-ulit. Ang halaga ng COUNT argument ay binabalewala kung ang pinagsunod-sunod na hanay ay masyadong maliit.

Gamitin ang Case 2 – Kunin ang Mga Manlalaro na Nagsisimula sa Letter na 'J' ang Pangalan

Ang utos ng ZSCAN ay maaaring gamitin upang i-filter ang mga bumalik na miyembro batay sa isang pattern na tugma. Sa kasong iyon, ang MATCH argument ay kailangang tukuyin.

Gamitin natin ang parehong halimbawa mula sa nakaraang use case. Ang kinakailangan ay kunin ang mga manlalaro na ang pangalan ay nagsisimula sa letrang 'J'. Ito ay para lamang ipatupad ang susunod na cool na tampok na may kaugnayan sa laro. Ang argumento ng MATCH ay maaaring tukuyin tulad ng sumusunod:

zscan LeaderBoard 0 tugma * J *

Ito ay dapat na may perpektong ibalik ang dalawang miyembro na ang pangalan ay Jeremy at John.

Konklusyon

Sa buod, ang ZSCAN command ay ginagamit upang umulit sa mga miyembro at mga marka ng isang Redis sorted set. Ang utos na ito ay kumikilos katulad ng SCAN command, maliban na ang ZSCAN command ay tumatanggap ng set key bilang ang unang argumento. Tulad ng tinalakay sa mga kaso ng paggamit, ang ZSCAN command ay maaaring gamitin sa iba't ibang paraan sa pamamagitan ng pagtukoy sa MATCH at COUNT na mga argumento kung saan maaari mong makuha ang mga miyembro at nauugnay na mga marka na tumutugma sa isang partikular na pattern at limitahan ang ibinalik na bilang ng miyembro sa bawat pag-ulit. Sa pangkalahatan, maaaring maging kapaki-pakinabang ang utos ng ZSCAN kapag kinukuha ang mga miyembro ng isang pinagsunod-sunod na hanay nang hindi hinaharangan ang server o kliyente.