我正在通过System.Web.Caching.Cache类在ASP.NET网站中缓存数据,因为检索数据非常耗时,且只有在内容人员更改后端数据时才会偶尔更改。
因此,在Application_Start中创建数据并将其存储在Cache中,到期时间为1天。
在访问数据时(在网站的许多页面上都会发生),我现在使用一个静态的CachedData类,类似于以下代码:
public static List<Kategorie> GetKategorieTitelListe(Cache appCache)
{
// get Data out of Cache
List<Kategorie> katList = appCache[CachedData.NaviDataKey] as List<Kategorie>;
// Cache expired, retrieve and store again
if (katList == null)
{
katList = DataTools.BuildKategorienTitelListe();
appCache.Insert(CachedData.NaviDataKey, katList, null, DateTime.Now.AddDays(1d), Cache.NoSlidingExpiration);
}
return katList;
}
我看到这段代码存在的问题是不具有线程安全性。
如果两个用户同时打开这两个页面并且缓存刚好过期,那么就有可能会多次检索到数据。
但是如果我锁定方法体,性能就会遇到麻烦,因为只有一个用户可以获取数据列表。
有没有一种简单的方法来防止这种情况?像这种情况下最佳实践是什么?
katlist
仍将为空,因此将调用DataTools.BuildKetegorienTiteListe
两次。因此,我认为lock
语句必须包含该方法的所有内容,除了return
。 - Johnny5