asp.net статическое кэширование в хеш-таблице - PullRequest
3 голосов
/ 07 октября 2011

Ранее я использовал объект приложения для кэширования данных, которые никогда не меняются. Я переписываю проект и обнаружил, что объект приложения - это нет-нет, и он только для устаревшей поддержки из классического ASP.

Я знаю, что могу также использовать кеш, но не хочу, поскольку я использую его для данных, которые должны быть аннулированы.

Поэтому я смотрю на статические переменные для статических данных (имеет смысл).

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

Примерно так:

''' <summary>
''' Methods and properties related to the access and management of the local static memory cache.
''' Fastest type of cache but not available across applications, web farm or web garden environments.
''' Use this cache when data is static or can be stale across application instances.
''' </summary>
''' <remarks></remarks>
Public Class LocalStaticCache

    'Internal data holder:
    Private Shared _objCache As Hashtable = Hashtable.Synchronized(New Hashtable)

    Private Sub New()
    End Sub

    ''' <summary>
    ''' Gets or sets an object in cache. Returns Nothing if the object does not exist.
    ''' </summary>
    ''' <param name="key">The name of the object.</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Property Item(key As String) As Object
        Get
            If String.IsNullOrEmpty(key) Then Return Nothing
            Return _objCache(key)
        End Get
        Private Set(value As Object)
            _objCache(key) = value
        End Set
    End Property

    ''' <summary>
    ''' Insert an object into the cache.
    ''' </summary>
    ''' <param name="key">The unique object key.</param>
    ''' <param name="value">The object to store in the cache.</param>
    ''' <remarks></remarks>
    Public Shared Sub Insert(key As String,
                             value As Object)
        If Not String.IsNullOrWhiteSpace(key) Then

            If _objCache.ContainsKey(key) Then
                'If the key already exists in the Cache it will overwrite only if the objects differ:
                Interlocked.CompareExchange(Item(key), value, value)
                Return
            End If

            'store the item to the cache:
            Item(key) = value
        End If
    End Sub

    ''' <summary>
    ''' Remove an object from the cache.
    ''' </summary>
    ''' <param name="key">The key of the object to remove.</param>
    ''' <remarks></remarks>
    Public Shared Sub Remove(key As String)
        If _objCache.ContainsKey(key) Then
            _objCache.Remove(key)
        End If
    End Sub

End Class

Как вы думаете, хранение всех статических данных в хеш-таблице - это хорошая идея для повышения производительности, или для каждого класса было бы лучше иметь в своем классе свои собственные статические держатели данных?

Этот поток безопасен ? Примечание: я реализую Hashtable.Synchronized и Interlocked.CompareExchange для предотвращения условий гонки - , но как насчет блокировки и конкуренции ?

Обратите внимание, что данные никогда не изменяются, если они были заданы в первый раз (элементы в хеш-таблице никогда не нуждаются в обновлении).

У меня есть наборы данных и большие порции наборов записей в качестве потоков памяти для хранения.

Есть мысли или указатели?

спасибо.

1 Ответ

1 голос
/ 07 октября 2011

Вместо того, чтобы писать собственное статическое приложение Hashtable и переопределять его, лучше использовать хранилище приложений напрямую.

Другим вариантом является использование объекта ASP.NET Cache, поскольку данные могут быть удалены, когда они не используются.

Добавление и удаление данных из Hashtable является поточно-ориентированным (запись только из одного потока). Если вы инициализируете данные в Application_Start, вам не нужно использовать какие-либо блокировки, потому что данные не меняются.

Если данные никогда не должны быть удалены, я буду хранить данные в разных классах в зависимости от контекста данных. Для этой цели используйте несколько одноэлементных классов с отложенной инициализацией.

Для новых приложений я бы больше не использовал наборы данных (или наборы записей?). Вам лучше использовать инфраструктуру сущностей, где вы можете создать свой слой доступа к данным.

Надеюсь, это поможет.

...