Cache עם Lock מבוסס memcached

28 במאי 2011

אין תגובות

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

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

הפיתרון עבד מאוד יפה כל עוד נמצאים באותו שרת, ובאותו Proccess של IIS. גם במקרים שלא, הפעולה צומצמה מאלפים של בקשות מקבילות לכמה עשרות, בתלות בהגדרות הרשת.
ובכל זאת רציתי לפתח פתרון אחר.
זה לא  Lock מושלם ב-100%, ובכל זאת, עושה את העבודה ומאיץ משמעותית את זמני עליית האתר מחדש אחרי Recycle או אבדן של חלקים משמעותיים ב-Cache.

הקוד פשוט מאוד וההערות שבתוכו די מיותרות.

         Public Shared Function GetFromCacheWithLock(Of T)(ByVal Name As String, ByVal Minutes As Integer, ByVal SecondsLock As Integer, ByVal Func As Func(Of T)) As T
Try
                ' אם מישהו אחר באמצע
While GetCache("MainFuncs.GetCache.Lock" & Name) = 1
                    ' כל עוד הפעולה רצה, תחכה
Threading.Thread.Sleep(30)
End While
InsertCache("MainFuncs.GetCache.Lock" & Name, 1, New TimeSpan(0, 0, SecondsLock)) ' "נעל" את הפעולה
Return GetFromCache(Name, Minutes, Func)
Finally
RemoveCache("MainFuncs.GetCache.Lock" & Name) ' הסר נעילה
End Try
End Function

Public Shared Function GetFromCache(Of T)(ByVal Name As String, ByVal Minutes As Integer, ByVal Func As Func(Of T), Optional ByVal Priority As Web.Caching.CacheItemPriority = CacheItemPriority.Default) As T
Return GetFromCache(Of T)(Name, New System.TimeSpan(0, Minutes, 0), Func, Priority)
End Function
Public Shared Function GetFromCache(Of T)(ByVal Name As String, ByVal Span As TimeSpan, ByVal Func As Func(Of T), Optional ByVal Priority As Web.Caching.CacheItemPriority = CacheItemPriority.Default) As T
Dim s As T
Dim z As Object = MemCacheClient.Get(Name)
If z Is Nothing Then ' אם אין במטמון, להריץ את הפעולה
s = Func()
InsertCache(Name, s, Span)
Return s
Else
Return z
End If
End Function

בהצלחה !

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *