לעשות את ה CACHE במקום הנכון

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

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

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

אז איך פתרנו את הבעיה? לאחר התייעצות עם ChatGPT הוא נתן כמה כיוונים, בעיקר לעשות "לוג של שאילתות איטיות", ולמצוא את מקור האיטיות. אכן מצאתי הרבה שאילתות שלוקחות כמה שניות טובות ואפילו הצלחתי לתקן כמה כאלו אבל זה לא היה משהו תדיר ולכן הרווח היה שולי. ברגע של הארה פניתי לראות את כל השאילתות שמבוצעות, ולאו דווקא את אלו האיטיות. הופתעתי לגלות אלפי שאילתות על כל גישה לאתר. שמרתי אותן בקובץ, מיינתי ואכן נוכחתי לגלות שהרבה שאילתות הן כפולות וחוזרות על עצמן. זה מקום מעולה לעשות בו CACHE! ולא רק זאת, זו נקודה מאוד ספציפית ומאוד כללית, ולא יהיה צריך לעשות שינוי נרחב במערכת.

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

איך עושים CACHE של שאילתות? אין קל מזה. בכל פעם שיש שאילתה, אתה זוכר אותה ואת הפרמטרים שלה. כדאי לעשות מהם HASH ייחודי שיאפשר פעם הבאה לזהות אם נעשית קריאה לאותה שאילתה עם אותם פרמטים. את התוצאה של השאילתה אנחנו מקטלגים תחת ה- HASH הזה. על מנת לשמור על מידע עדכני באתר ועל גודל הזכרון, אנחנו רק זוכרים תוצאות למשך כ- 20 שניות.