[英]Selective Cache clearing across load balanced servers (ASP.Net)
We have a website that runs on two load balanced servers. 我们有一个运行在两个负载平衡服务器上的网站。 We use the ASP.Net caching to help improve performance by caching high usage data. 我们使用ASP.Net缓存来缓存高使用率数据,从而帮助提高性能。 BUT, occasionally that data changes. 但是,偶尔会有数据发生变化。 When it does, we need to clear the relevant cache items on BOTH the load balanced servers. 当它发生时,我们需要清除负载平衡服务器上的相关缓存项。 Does anyone have some easy to implement suggestions for how this can be done? 有没有人有一些容易实施的建议如何做到这一点?
I know that there is software out there to manage this for you (Microsoft Velocity for one). 我知道有一些软件可以为你管理(Microsoft Velocity for one)。 I also know that there are other options for having separate state servers etc. However, for what we want they all seem like overkill. 我也知道有其他选择可以使用单独的状态服务器等。但是,对于我们想要的东西,它们看起来都有点过分。 Just a simple mechanism for clearing out specific cache items across servers is all we need for now. 我们现在只需要一种简单的机制来清除服务器上的特定缓存项。
Thanks for any suggestions. 谢谢你的任何建议。
We use a simple web service approach. 我们使用简单的Web服务方法。 Our cache clear mechanism checks a web config setting to see if any other servers exist and calls the web service on those server(s) asynchronously. 我们的缓存清除机制检查Web配置设置以查看是否存在任何其他服务器并异步调用这些服务器上的Web服务。
We store data with specific naming convetions to make it easy to clear what we want. 我们存储具有特定命名对话的数据,以便于清除我们想要的内容。 So we pass in either a prefix or postfix for the item to be removed as sometimes it might be user specific (ex. the userid is appended to the name of the item) or application specific (ex. the prefix of the item is the application name). 因此,我们传入要删除的项目的前缀或后缀,因为有时它可能是特定于用户的(例如,用户ID附加到项目的名称)或特定于应用程序(例如,项目的前缀是应用程序)名称)。
Here is a VB example of the ClearItem routine that would be called on either one of your nodes: 这是一个可以在任何一个节点上调用的ClearItem例程的VB示例:
Public Shared Sub ClearItem(ByVal strPrefix As String, ByVal strPostfix As String)
If WebConfig.Caching_Enabled() Then
' Exit if no criteria specified '
If IsNothing(strPrefix) AndAlso IsNothing(strPostfix) Then
Exit Sub
End If
' At the very least we need a Postfix '
If Not IsNothing(strPostfix) AndAlso Not strPostfix.Length.Equals(0) Then
_ClearItem(strPrefix, strPostfix)
End If
If WebConfig.Caching_WebFarmEnabled() Then
' Now clear the cache across the rest of the server farm '
_ClearItem_WebFarm(strPrefix, strPostfix)
End If
End If
End Sub
Private Shared Sub _ClearItem_WebFarm(ByVal strPrefix As String, ByVal strPostfix As String)
If WebConfig.Caching_WebFarmEnabled() Then
' Use a web service on each server in the farm to clear the '
' requested item from the Cache '
' Determine which servers need to remove cache items '
Dim arrServers As String()
arrServers = Split(WebConfig.Caching_WebFarmServers(), "|")
Dim strServer As String ' Holds which server we are currently contacting '
' Loop through all the servers and call their web services '
For Each strServer In arrServers
Dim WS As New WebServiceAsyncCall
WS.StartCallBack(strServer, strPrefix, strPostfix)
Next
End If
End Sub
Private Shared Sub _ClearItem(ByVal strPrefix As String, ByVal strPostfix As String)
If WebConfig.Caching_Enabled() Then
' Determine how we are comparing keys '
Dim blnPrefix, blnPostfix As Boolean
If strPrefix.Length.Equals(0) Then
blnPrefix = False
Else
blnPrefix = True
End If
If strPostfix.Length.Equals(0) Then
blnPostfix = False
Else
blnPostfix = True
End If
' Reference the Cache collection '
Dim objCache As System.Web.Caching.Cache = HttpContext.Current.Cache
' Exit if the cache is empty '
If objCache.Count.Equals(0) Then
Exit Sub
End If
' Clear out the cache for all items matching the input(s) (on this local server) '
Dim objCacheEnum As IEnumerator = objCache.GetEnumerator()
Dim objCacheItem As Object
Dim objCurrentKey As System.Collections.DictionaryEntry
Dim strCurrentKey As String
' Enumerate through the cache '
While objCacheEnum.MoveNext()
objCurrentKey = CType(objCacheEnum.Current, DictionaryEntry)
strCurrentKey = objCurrentKey.Key.ToString()
' How are we comparing the key? '
If blnPrefix AndAlso Not (blnPostfix) Then ' Only by PREFIX '
If strCurrentKey.StartsWith(strPrefix) Then
' Remove it from the cache '
objCacheItem = objCache.Remove(strCurrentKey) ' Returns a reference to the item '
objCacheItem = Nothing ' Need to explicitly nuke this because the objCache.Remove() above doesn t destroy '
End If
ElseIf Not (blnPrefix) AndAlso blnPostfix Then ' Only by POSTFIX '
If strCurrentKey.EndsWith(strPostfix) Then
' Remove it from the cache '
objCacheItem = objCache.Remove(strCurrentKey) ' Returns a reference to the item '
objCacheItem = Nothing ' Need to explicitly nuke this because the objCache.Remove() above doesn t destroy '
End If
ElseIf blnPrefix AndAlso blnPostfix Then ' By both PREFIX and POSTFIX'
If strCurrentKey.StartsWith(strPrefix) AndAlso strCurrentKey.EndsWith(strPostfix) Then
' Remove it from the cache '
objCacheItem = objCache.Remove(strCurrentKey) ' Returns a reference to the item '
objCacheItem = Nothing ' Need to explicitly nuke this because the objCache.Remove() above doesn t destroy '
End If
Else
' Not comparing prefix OR postfix? Why bother continuing then! '
Exit Sub
End If
End While
End If
End Sub
You can see that the code above calls other server(s) by using this helper class: 您可以通过使用此帮助程序类来查看上面的代码调用其他服务器:
Private Class WebServiceAsyncCall
Public Sub StartCallBack(ByVal strService As String, ByVal strPrefix As String, ByVal strPostfix As String)
ActiveWebServiceCounter += 1
Dim clearCacheProxy As New CacheClearService.CacheClear ' This is the web service which of course will exist on the other node as well '
clearCacheProxy.Url = strService
AddHandler clearCacheProxy.ClearItemCompleted, AddressOf DoneCallBack
clearCacheProxy.ClearItemAsync(strPrefix, strPostfix)
End Sub
Public Sub DoneCallBack(ByVal sender As Object, ByVal e As CacheClearService.ClearItemCompletedEventArgs)
ActiveWebServiceCounter -= 1
If e.Result.Length > 0 Then ' Something failed '
' Log the error '
End If
End Sub
End Class
The web service on the remote server then calls the same code that the _ClearItem called. 然后,远程服务器上的Web服务调用_ClearItem调用的相同代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.