מדריך CSHTML – עבודה עם מטמון (Cache) לשיפור הביצועים של האתר שלך
בכל פעם שמישהו מבקש דף מהאתר שלך, שרת ה-Web צריך לבצע עבודה מסוימת על-מנת לשרת את הבקשה. ייתכן שעבור חלק מהדפים שלך, השרת יאלץ לבצע משימות שבאופן יחסי לוקחות זמן רב (כמו שליפת נתונים מבסיס הנתונים).
אפילו אם במנוחים מוחלטים פעולה מסוימת לא נמשכת זמן רב, אם השרת חווה תעבורת נתונים גבוהה, סידרה שלמה של פעולות כאלו יכולות לגרום לשרת לעבוד זמן רב וכמובן, להשפיע בצורה קשה על הביצועים של האתר.
דרך אחת לשפר את ביצועיו של האתר בנסיבות כגון אלו, היא להשתמש בזיכרון מטמון (Cache). במידה והאתר מקבל בקשות חוזרות עבור אותו המידע, ומידע זה לא צריך להשתנות עבור כל משתמש ולא רגיש מבחינת רמת העדכנות שלו, במקום להביא מחדש או לחשב את המידע, ניתן לייצר מידע זה פעם אחת ולשמור את התוצאות. בפעם הבאה שבקשה נוספת תגיע עבור אותו המידע, נקבל מידע זה מה- Cache.
באופן כללי, מומלץ להכניס ל-Cache מידע שלא משתנה באופן תדיר. כאשר מכניסים מידע לתוך ה-Cache , הוא נשמר בזיכרון על גבי שרת ה- Web. ניתן לציין את כמות הזמן שמידע זה ישאר ב- Cache מטווח של שניות עד טווח של ימים. כאשר "פג התוקף" של תקופת השמירה המצוינת ל-Cache, המידע מוסר בצורה אוטומטית מהזיכרון.
הערה : מופעים שונים של נתונים בתוך ה-Cache יכולים להיות מוסרים מסיבות אחרות מאשר "פקיעת התוקף" של הזמן המוקצה להם. למשל, שרת ה-Web יכול באופן זמני לחוות מחסור בזיכרון מסיבות שונות, ועל מנת לרוץ באופן תקין, הוא יכול להסיר מופעים מה-Cache על מנת להמשיך לעבוד באופן תקין.
תאר לעצמך שלאתר ה-Web שלך יש דף שמציג את הטמפרטורה הנוכחית ותחזית מזג האוויר. על-מנת לקבל סוג מידע שכזה ייתכן שתשלח בקשה לשירות חיצוני. מכיוון שמידע שכזה לא משתנה בתדירות גבוהה (למשל, כל שעתיים) ומכיוון שקריאות לשירותים חיצוניים דורשות זמן ורוחב פס, יש לנו מועמד טוב עבור Caching.
שפת CSHTML כוללת עוזר (helper) שנקרא WebCache, שהופך את הוספת יכולת ה- Cache לאתר שלנו והוספת מידע ל-Cache, לפעולות פשוטות וקלות. בתהליך זה ניצור דף אשר מבצע שמירה של הזמן הנוכחי לזיכרון ה-Cache. זוהי לא דוגמא מהעולם האמיתי, כי כמובן הזמן הנוכחי הוא משהו שמשתנה לעיתים תכופות וכמובן קל מאוד לחישוב, אבל זוהי דרך טובה להדגים איך עובד Cache הלכה למעשה.
1. הוסף דף לאתר חדש וקרא לו WebCache.cshtml.
2. הוסף את הקוד הבא לדף:
@{
var cacheItemKey = "Time";
var cacheHit = true;
var time = WebCache.Get(cacheItemKey);
if (time == null)
{
cacheHit = false;
}
if (cacheHit == false)
{
time = @DateTime.Now;
WebCache.Set(cacheItemKey, time, 1, false);
}
}
<!DOCTYPE html>
<html>
<head>
<title>WebCache Helper Sample</title>
</head>
<body>
<div>
@if (cacheHit)
{
@:Found the time data in the cache.
}
else
{
@:Did not find the time data in the cache.
}
</div>
<div>
This page was cached at @time.
</div>
</body>
</html>
כאשר אנו שומרים את המידע ל-Cache, אנו משתמשים בשם שהוא יחודי עבור האתר שלנו. במקרה שלנו, אנו משתמשים בשם Time. זהו ה – cachItemKey המופיע בדוגמת הקוד.
בקוד אנו קודם קוראים ליחידת ה-Cache הנקראת – Time . אם חוזר ערך (כלומר, אם יחידת ה-Cache אינה מחזירה ערך ריק – null) אז אנו פשוט מכניסים את הערך של יחידת ה-Cache לתוך המשתנה time.
בכל מקרה, אם יחידת ה-Cache אינה קיימת (כאמור, מחזירה null), אז אנו מכניסים את ערך הזמן הנוכחי לתוך המשתנה time, מוסיפים ערך זה לתוך ה-Cache ומכוונים את ערך "פקיעת התוקף" למשך דקה אחת. אם לא מתבצעת בקשה נוספת לדף במשך דקה, יחידת ה-Cache תמחק מהזיכרון. (ערך ברירת המחדל עבור יחידה בזכרון ה-Cache הינו 20 דקות).
הקוד מדגים את התבנית הכללית שבה נשתמש כאשר אנו משתמשים ב-Cache. לפני שלוקחים ערך כלשהו מה-Cache, צריך תמיד לבדוק אם הפונקציה WebCache.Get החזירה null. זכור כי ייתכן שיחידת ה-Cache הוסרה מכיוון שעבר פרק הזמן של "פקיעת התוקף" שלה, או שהיא הוסרה מסיבות אחרות, אז כמובן שאף פעם לא מובטח שהערך עדיין נמצא ב-Cache.
3. הצג את הדף WebCache.cshtml בדפדפן. בפעם הראשונה שנבקש את הדף, ערך הזמן המוצג אינו מגיע מה-Cache, אך הקוד מתווסף ל- Cache.
4. רענן את הדף WebCache.cshtml בדפדפן. הפעם, המידע המוצג לגבי הזמן, מגיע מה-Cache. שים לב שהזמן אכן לא השתנה מהפעם האחרונה שהצגת את הדף.
5. המתן דקה אחת על מנת לאפשר ליחידת ה-Cache להתרוקן, ואז רענן שוב את הדף. הדף שוב מכיל את המידע המעודכן לגבי הזמן ואינו מגיע מה-Cache, אך כמובן המידע המעודכן עובר גם לזיכרון ה-Cache כמו שראינו בפעולה מספר 3.
תגובות בפייסבוק