שימוש ב-Memcache

בדף הזה מוסבר איך להגדיר את שירות memcache ולעקוב אחריו באפליקציה באמצעות מסוף Google Cloud . בנוסף, מוסבר איך להשתמש ב-App Engine memcache Python API כדי להגדיר ולאחזר ערכים שנשמרו במטמון, ואיך להשתמש בתכונה compare-and-set כדי לטפל בבקשות כתיבה בו-זמניות לאותו מפתח memcache. מידע נוסף על memcache זמין במאמר סקירה כללית על memcache.

הגדרת memcache

  1. עוברים לדף Memcache במסוף Google Cloud .
    כניסה לדף Memcache
  2. בוחרים את רמת השירות של memcache שבה רוצים להשתמש:
    • משותף (ברירת מחדל) – ללא תשלום, ומספק קיבולת מטמון על בסיס האפשרות הטובה ביותר.
    • ייעודי – החיוב הוא לפי GB-שעה של גודל מטמון, והקיבולת של המטמון קבועה ומוקצית באופן בלעדי לאפליקציה שלכם.

מידע נוסף על סוגי השירותים הזמינים מופיע במאמר סקירה כללית על Memcache.

שמירת ערכים במטמון ואחזור שלהם

שמירת ערך במטמון

משתמשים ב-add() כדי להוסיף ערך למפתח אם ורק אם הוא עדיין לא קיים, עם זמן תפוגה אופציונלי:

memcache.add(key="[KEY]", value="[VALUE]", time=[EXPIRATION_TIME])

לדוגמה, כדי להוסיף את הערך raining למפתח weather_USA_98105 עם זמן תפוגה של שעה אחת מהרגע שבו הערך נכתב:

memcache.add(key="weather_USA_98105", value="raining", time=3600)

מידע נוסף על add() ושיטות אחרות להגדרת ערכים זמין במסמכי התיעוד של memcache API בשפת Python.

דוגמאות נוספות לערכי שמירה במטמון מופיעות במאמר דוגמאות ל-Memcache.

חיפוש ערכים שמורים במטמון

משתמשים בפונקציה get() כדי לחפש את הערך של מפתח יחיד:

memcache.get(key="[KEY]")

לדוגמה, כדי לקבל את הערך של המפתח weather_USA_98105:

memcache.get(key="weather_USA_98105")

מידע נוסף על get() ועל שיטות אחרות לחיפוש ערכים זמין במסמכי התיעוד של Memcache API בשפת Python.

מעקב אחר memcache במסוף Google Cloud

  1. עוברים לדף Memcache במסוף Google Cloud .
    כניסה לדף Memcache
  2. מעיינים בדוחות הבאים:
    • רמת השירות של Memcache: מראה אם האפליקציה משתמשת ברמת השירות Shared או Dedicated. אם אתם בעלים של הפרויקט, תוכלו לעבור בין שתי האפשרויות. מידע נוסף על רמות השירות
    • שיעור ההיטים: אחוז בקשות הנתונים שסופקו מהמטמון, וגם המספר הגולמי של בקשות הנתונים שסופקו מהמטמון.
    • פריטים במטמון.
    • הגיל של הפריט הכי ישן: הגיל של הפריט הכי ישן במטמון. שימו לב: הגיל של פריט מתאפס בכל פעם שמשתמשים בו, בין אם לקריאה או לכתיבה.
    • גודל המטמון הכולל.
  3. אפשר לבצע את הפעולות הבאות:

    • מפתח חדש: הוספת מפתח חדש למטמון.
    • חיפוש מפתח: אחזור מפתח קיים.
    • ניקוי המטמון: הסרת כל צמדי המפתח/ערך מהמטמון.
  4. (רק ב-memcache ייעודי) מעיינים ברשימה של מקשי קיצור.

    • 'מקשים פעילים' הם מקשים שמקבלים יותר מ-100 שאילתות לשנייה (QPS) במטמון memcache.
    • הרשימה הזו כוללת עד 100 מקשי קיצור, ממוינים לפי QPS הכי גבוה.

טיפול בכתיבות בו-זמניות

כדי להשתמש בתכונה compare and set כדי לטפל בפעולות כתיבה מכמה בקשות לאותו מפתח memcache:

  1. יוצרים מופע של אובייקט memcache Client.
  2. משתמשים בלולאת ניסיון חוזר (רצוי עם הגבלה על מספר הניסיונות החוזרים ועם שימוש בנסיגה אקספוננציאלית)
    1. בתוך לולאת הניסיון החוזר, מאחזרים את המפתח באמצעות gets() או get_multi() עם הפרמטר for_cas שמוגדר ל-True.
    2. בתוך לולאת הניסיון החוזר, מעדכנים את ערך המפתח באמצעות cas() או cas_multi().

בקטע הקוד הבא אפשר לראות דרך אחת להשתמש בתכונה compare and set:

def bump_counter(key):
   client = memcache.Client()
   while True: # Retry loop
     counter = client.gets(key)
     if counter is None: raise KeyError('Uninitialized counter')
     if client.cas(key, counter+1):
        break

לולאת הניסיון החוזר נחוצה כי בלי הלולאה הקוד הזה לא באמת מונע תנאי מירוץ, הוא רק מזהה אותם. שירות memcache מבטיח שאם משתמשים בו בדפוס שמוצג כאן (כלומר, באמצעות gets() ו-cas()), אם שני מופעים שונים של לקוח (או יותר) מעורבים בתנאי מירוץ, רק הראשון שמבצע את הפעולה cas() מצליח (מחזיר True), ואילו השני (והבאים אחריו) נכשל (מחזיר False).

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

מידע נוסף על הפקודות compare ו-set זמין במאמר סקירה כללית על Memcache.

המאמרים הבאים