gpt4 book ai didi

c# - 锁定加载数据到缓存

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

我在 Web 应用程序中有一个帮助程序类,它所做的事情之一是将常见的、不变的数据对象呈现为静态属性。我正在加载这些对象如下:

public static class MyWebHelper
{
#region - Constants & Fields
private const string LocationCacheKey = "MyWebHelper_Locations";
private static object LocationLoadLock = new object();
private static MemoryCache m_SiteCache;
#endregion

#region - Properties
/// <summary>
/// Gets the uneditable collection of locations.
/// </summary>
public static ReadOnlyCollection<Location> Locations
{
get
{
EnsureLocationsCache();
return (ReadOnlyCollection<Location>)SiteCache[LocationCacheKey];
}
}

/// <summary>
/// Gets the MemoryCache object specific for my site cache.
/// </summary>
public static MemoryCache SiteCache
{
get
{
if (m_SiteCache == null)
{
m_SiteCache = new MemoryCache("MyWeb_SiteCache");
}
return m_SiteCache;
}
}
#endregion

#region - Methods
private static void EnsureLocationsCache()
{
lock (LocationLoadLock)
{
if (SiteCache[LocationCacheKey] == null)
{
//
// Load all Locations from the database and perform default sorting on location code.
//
List<Location> lLocations = DataAccess.GetAllLocations();
lLocations.Sort(delegate(Location l1, Location l2) { return string.CompareOrdinal(l1.Code, l2.Code); });
SiteCache[LocationCacheKey] = new ReadOnlyCollection<Location>(lLocations);
}
}
}
#endregion
}

我的问题是,锁定有什么帮助吗?我试图减少对数据库的调用,但锁定只是引入了开销吗?缓存数据在整个站点中使用得非常普遍,并且几乎永远不会改变。另外,我是否锁定在正确的位置?

最佳答案

如果你做锁,我会用double-checked locking这样您就不会在每次从缓存中读取时都产生获取锁的开销。

我也质疑锁定的必要性。如果不锁定,那么多个线程可能会同时尝试刷新缓存,但这种情况很少见,除非非常昂贵,否则不会对静态只读数据造成问题。

如果它很贵,那么您可以按照@asawyer 评论中的建议插入一个Lazy<ReadOnlyCollection<Location>>。进入缓存,这样锁定将由 Lazy<T> 处理.

关于c# - 锁定加载数据到缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9618767/

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