Ранее я использовал объект приложения для кэширования данных, которые никогда не меняются. Я переписываю проект и обнаружил, что объект приложения - это нет-нет, и он только для устаревшей поддержки из классического 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 для предотвращения условий гонки - , но как насчет блокировки и конкуренции ?
Обратите внимание, что данные никогда не изменяются, если они были заданы в первый раз (элементы в хеш-таблице никогда не нуждаются в обновлении).
У меня есть наборы данных и большие порции наборов записей в качестве потоков памяти для хранения.
Есть мысли или указатели?
спасибо.