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 cursor [ דפוס MATCH ] [ COUNT member_count ]

מיון_set_key : המפתח של הסט הממוין.
סַמָן : ערך הסמן מתחיל מ-0 ומסתיים ב-0 אם מדובר באיטרציה מלאה.



הטיעונים הבאים הם אופציונליים:

התאמה : תבנית שתתאים בעת שליפת האלמנטים בכל איטרציה. רק החברים התואמים מוחזרים.
לספור : המספר המשוער של איברים שיוחזרו בכל איטרציה.

ערכת התוצאות המוחזרת לכל איטרציה מכילה כמה אלמנטים. החלק הראשון הוא מספר שלם ללא סימן של 64 סיביות המייצג את הסמן שיועבר לקריאה הבאה. החלק הבא הוא מערך של חברים וציונים קשורים.

שימוש במקרה 1 - אחזר את כל החברים ואת המשימות שהושלמו במשחק מקוון

נניח שחברת משחקים מקוונים שומרת על לוח הישגים באמצעות הסט הממוין Redis. מכיוון שמשתמשים עצומים משחקים במשחק באופן פעיל, הם צריכים דרך לאחזר כל שחקן והניקוד המשויך לו שהוא מספר המשימות שהושלמו. חובה לבצע את האחזור מבלי לחסום את השרת. לכן, ההמלצה היא להשתמש בפקודה ZSCAN באופן הבא:

ראשית, אנו יוצרים סט ממוין עם כמה שחקנים ומספר המשימות שהושלם.

zadd LeaderBoard 12 שחקן 6: ג'ון 4 שחקן 2: מרי 22 שחקן 1: פאטל חֲמֵשׁ עֶשׂרֵה שחקן: אחד עשר 23 שחקן 5: אן 30 שחקן 7: קשוח 23 שחקן 12: אבי שתיים שחקן 13: ניקי 6 שחקן 9: ג'רמי 7 שחקן 45: קינה

כעת, אנו יכולים לחזור על חברי הסט הממוין באופן הבא:

zscan LeaderBoard 0

תְפוּקָה:

ערך הסמן הוא 0 בערכת התוצאות המוחזרת, כלומר כל האיברים מוחזרים בסוף האיטרציה הראשונה. במקרה זה, מכיוון שמספר החברים קטן, Redis מייצג את החברים הללו באמצעות קידוד ארוז בהקצאה אחת. לכן, עד שמגיעים לגודל חבילה או מספר חברים מקסימליים, הפקודה מחזירה את כל האיברים בסט הממוין. זה נקרא איטרציה מלאה. כי בסוף האיטרציה הראשונה, אנחנו מקבלים את כל עשרת החברים והציונים שלהם. אם יש לנו מאות חברים, הוא מיוצג כטבלת גיבוב בזיכרון. לכן, נדרשות מספר איטרציות כדי להחזיר את כל החברים.

ניתן להשתמש בפרמטר COUNT כדי להגביל את מספר החברים המוחזרים באיטרציה. כברירת מחדל, ארגומנט זה מוגדר ל-10. אם הסט הממוין מורכב ממאות איברים, הוא מיוצג על ידי טבלת hash בזיכרון. אז, מספר החברים שהוחזרו הוא בסביבות עשרה לכל איטרציה. הערך של הארגומנט COUNT מתעלם אם הסט הממוין קטן מדי.

מקרה שימוש 2 - אחזר את השחקנים ששמם מתחיל באות 'J'

ניתן להשתמש בפקודה ZSCAN כדי לסנן את האיברים שהוחזרו על סמך התאמת דפוס. במקרה זה, יש לציין את הארגומנט MATCH.

בואו נשתמש באותה דוגמה ממקרה השימוש הקודם. הדרישה היא להביא את השחקנים ששמם מתחיל באות 'J'. זה רק כדי ליישם את התכונה המגניבה הבאה הקשורה למשחק. ניתן לציין את הארגומנט MATCH באופן הבא:

zscan LeaderBoard 0 התאמה * י *

באופן אידיאלי זה אמור להחזיר שני חברים ששמם הם ג'רמי וג'ון.

סיכום

לסיכום, הפקודה ZSCAN משמשת לחזרה על החברים והציונים של ערכה ממוינת של Redis. פקודה זו מתנהגת כמו פקודת SCAN, אלא שפקודת ZSCAN מקבלת את מפתח הסט כארגומנט הראשון. כפי שנדון במקרים של שימוש, ניתן להשתמש בפקודה ZSCAN בדרכים שונות על ידי ציון הארגומנטים MATCH ו-COUNT שבהם ניתן לאחזר את האיברים והציונים המשויכים התואמים לדפוס מסוים ולהגביל את ספירת האיברים המוחזרים לכל איטרציה. בסך הכל, הפקודה ZSCAN יכולה להיות שימושית בעת אחזור החברים של קבוצה ממוינת מבלי לחסום את השרת או הלקוח.