我将数据存储在缓存中是为了不经常访问数据库(如果数据有点过时并不重要),数据集不是特别大但操作可能需要一些时间由于查询的复杂性(很多联接和子查询)。我有一个静态助手类,数据用于绑定各个页面。该页面调用它如下:
public static List<MyList> MyDataListCache
{
get
{
var myList = HttpContext.Current.Cache["myList"];
if (myList == null)
{
var result = MyLongRunningOperation();
HttpContext.Current.Cache.Add("myList", result, null, DateTime.Now.AddMinutes(3),
Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);
return result;
}
}
else
{
return (List<MyList>)myList;
}
}
}
这项工作正常,除非很多人在项目超出缓存时同时点击页面。数以百计的LongRunningOperations被启动并导致应用程序崩溃。我该如何避免这个问题?我已经尝试使用异步任务来订阅,如果任务当前正在运行,但没有运气让它工作。
答案 0 :(得分:1)
启动此服务后,您应立即调用LongRunningOperation()来预热缓存。
其次,你总是希望返回一些东西,所以我会考虑一个后台任务来在它到期之前刷新它。
做这两件事会使你描述的情况无效。缓存将由后台工作者刷新,因此每个人都很高兴:)