Выборочный Кэш, очищающийся через загрузку, сбалансировал серверы (ASP.NET)

Как вы, вероятно, знаете, конструктор для типа enum должен быть закрытым или закрытым доступом.

Он вызывается автоматически и создает константы, которые определены в начале тела enum.

Вы не можете вызвать конструктор enum самостоятельно.

Вот несколько примеров, которые могут быть полезны.

public enum MySingleton {
    // if you have multiple constants here - it's not Singleton
    INSTANCE;

    // if you need to provide some info to your INSTANCE,
    // you can add params to its methods
    public void someMethod(String value) {
        System.out.println("inside someMethod, value is " +value);
    }
}

Если вам нужно, чтобы экземпляр имел некоторое состояние, вы можете добавить поля и конструктор:

public enum MySingleton {
    INSTANCE("Hello");

    private String message;

    MySingleton(String msg) {
        this.message = msg;
    }

    // you can even have getter/setter for it
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

Пример основного метода:

public static void main(String[] args) {
    System.out.println(MySingleton.INSTANCE.getMessage()); // prints Hello

    MySingleton.INSTANCE.setMessage("Bye");

    System.out.println(MySingleton .INSTANCE.getMessage()); // prints Bye
}
8
задан JoshBerke 21 April 2009 в 21:31
поделиться

2 ответа

Мы используем простой подход к веб-сервису. Наш механизм очистки кэша проверяет настройки веб-конфигурации, чтобы определить, существуют ли какие-либо другие серверы, и вызывает веб-службу на этих серверах асинхронно.

Мы храним данные с определенными соглашениями об именах, чтобы упростить очистку того, что мы хотим. Таким образом, мы передаем либо префикс, либо постфикс для удаляемого элемента, так как иногда это может зависеть от пользователя (например, идентификатор пользователя добавляется к имени элемента) или от приложения (например, префикс элемента - это приложение). название).

Вот пример VB подпрограммы ClearItem, которая будет вызываться на любом из ваших узлов:

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

Вы можете увидеть, что приведенный выше код вызывает другие серверы с помощью этого вспомогательного класса:

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

Сеть Затем служба на удаленном сервере вызывает тот же код, который вызывал _ClearItem.

1
ответ дан 5 December 2019 в 22:20
поделиться

Почему бы не определить зависимость кэша от объекта, который могут видеть оба сервера? Вы можете использовать зависимость кэша SQL или File .

Ссылка на страницу кэширования Msdn.

5
ответ дан 5 December 2019 в 22:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: