gpt4 book ai didi

哈希表中的asp.net静态缓存

转载 作者:行者123 更新时间:2023-12-02 11:24:32 30 4
gpt4 key购买 nike

我之前使用应用程序对象来缓存永不更改的数据。我正在重写该项目,并发现应用程序对象是一个禁忌,它只是为了经典 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 来防止竞争条件 - 但是锁定和争用呢?

请注意,一旦第一次设置数据,数据就永远不会更改(哈希表中的项目永远不需要更新)。

我有数据集和大块记录集作为内存流来存储。

有什么想法或建议吗?

谢谢。

最佳答案

与其编写自己的静态哈希表并重新实现应用程序,不如直接使用应用程序存储。

另一个选择是使用 ASP.NET Cache 对象,因为数据可以在不使用时删除。

从哈希表中添加和删除数据是线程安全的(仅从一个线程写入)。如果您在 Application_Start 上初始化数据,则不必使用任何锁,因为数据不会更改。

如果数据永远不应该被删除,我会根据数据的上下文将数据存储在不同的类中。为此,请使用多个带有延迟初始化的单例类。

对于新应用程序,我将不再使用数据集(或记录集?)。您最好使用 Entity Framework ,您可以在其中基本上生成数据访问层。

希望这有帮助。

关于哈希表中的asp.net静态缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7684875/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com