בדף הזה מוסבר איך להגדיר את שירות memcache ולעקוב אחריו באפליקציה באמצעות מסוף Google Cloud . בנוסף, מוסבר במאמר איך להשתמש ב-App Engine memcache Python API כדי להגדיר ולאחזר ערכים ששמורים במטמון, ואיך להשתמש בתכונה compare-and-set כדי לטפל בבקשות כתיבה בו-זמניות לאותו מפתח memcache. מידע נוסף על Memcache זמין במאמר סקירה כללית על Memcache.
הגדרת memcache
- עוברים לדף Memcache במסוף Google Cloud .
כניסה לדף Memcache - בוחרים את רמת השירות של 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() ושיטות אחרות להגדרת ערכים זמין במסמכי התיעוד של API בשפת Python של memcache.
דוגמאות נוספות לערכי שמירה במטמון מופיעות במאמר דוגמאות ל-Memcache.
חיפוש ערכים שמורים
משתמשים בפונקציה get() כדי לחפש את הערך של מפתח יחיד:
memcache.get(key="[KEY]")
לדוגמה, כדי לקבל את הערך של המפתח weather_USA_98105:
memcache.get(key="weather_USA_98105")
מידע נוסף על get() ועל שיטות אחרות לחיפוש ערכים זמין במסמכי התיעוד של Memcache API בשפת Python.
מעקב אחר memcache במסוף Google Cloud
- עוברים לדף Memcache במסוף Google Cloud .
כניסה לדף Memcache - מעיינים בדוחות הבאים:
- רמת השירות של Memcache: מראה אם האפליקציה משתמשת ברמת השירות Shared או Dedicated. אם אתם בעלים של הפרויקט, תוכלו לעבור בין שתי האפשרויות. מידע נוסף על רמות השירות
- שיעור ההיטים: בקטע הזה מוצג אחוז בקשות הנתונים שסופקו מהמטמון, וגם המספר הגולמי של בקשות הנתונים שסופקו מהמטמון.
- פריטים במטמון.
- גיל הפריט הוותיק ביותר: גיל הפריט הוותיק ביותר שנשמר במטמון. שימו לב: הגיל של פריט מאופס בכל פעם שמשתמשים בו, בין אם קוראים אותו או כותבים בו.
- גודל המטמון הכולל.
אפשר לבצע את הפעולות הבאות:
- מפתח חדש: הוספת מפתח חדש למטמון.
- חיפוש מפתח: אחזור מפתח קיים.
- ניקוי המטמון: הסרת כל צמדי המפתח/ערך מהמטמון.
(רק ב-Memcache ייעודי) מעיינים ברשימה של מקשי קיצור.
- 'מפתחות חמים' הם מפתחות שמקבלים יותר מ-100 שאילתות לשנייה (QPS) ב-memcache.
- הרשימה הזו כוללת עד 100 מקשי קיצור, ממוינים לפי QPS הכי גבוה.
טיפול בכתיבות בו-זמניות
כדי להשתמש בתכונה compare and set כדי לטפל בפעולות כתיבה מכמה בקשות לאותו מפתח memcache:
- יוצרים מופע של אובייקט memcache
Client. - משתמשים בלולאת ניסיון חוזר (רצוי עם הגבלה על מספר הניסיונות החוזרים ועם שימוש בהשהיה מעריכית לפני ניסיון חוזר)
- בתוך לולאת הניסיון החוזר, מקבלים את המפתח באמצעות
gets()אוget_multi()עם הפרמטרfor_casשמוגדר ל-True. - בתוך לולאת הניסיון החוזר, מעדכנים את ערך המפתח באמצעות
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.
המאמרים הבאים
- מידע נוסף על memcache זמין במאמר Memcache Overview.
- דוגמאות קוד לשימוש ב-memcache ב-Python מופיעות במאמר דוגמאות ל-memcache.