如果用户尝试读取 HttpContext.Current.Cache [key] 而另一个尝试删除对象 HttpContext.Current.Cache.Remove(key)同时?
考虑一下数百名用户从缓存中读取并尝试同时清理一些缓存对象。会发生什么,它是否安全?
是否可以在缓存中创建数据库感知业务对象?
答案 0 :(得分:3)
内置的ASP.Net Cache对象(http://msdn.microsoft.com/en-us/library/system.web.caching.cache.aspx)是线程安全的,因此在多线程环境中插入/删除操作本质上是安全的。
将任何对象放入缓存的主要要求是必须是可序列化的。所以,是的,您的db-aware业务对象可以进入缓存。
答案 1 :(得分:1)
如果代码无法获取对象,则不返回任何/ null。
如果您有机会频繁删除对象,为什么还要先缓存一个对象?如果对象不再在缓存中,则最好设置到期时间并重新加载对象。
你能解释一下“DB感知对象”吗?您的意思是sql cache dependency,还是仅包含有关数据库连接信息的对象?
修改强> 回应评论#3。
我想我们在这里遗漏了一些东西。让我解释一下我的意思,你可以告诉我它是否正确。
如果是这种情况,那么您不需要Sql Cache依赖项。
答案 2 :(得分:0)
我有一个代码来填充缓存:
string cacheKey = GetCacheKey(filter, sort);
if (HttpContext.Current.Cache[cacheKey] == null)
{
reader = base.ExecuteReader(SelectQuery);
HttpContext.Current.Cache[cacheKey] =
base.GetListByFilter(reader, filter, sort);
}
return HttpContext.Current.Cache[cacheKey] as List<CurrencyDepot>;
当表更新下面的清理代码执行时:
private void CleanCache()
{
IDictionaryEnumerator enumerator =
HttpContext.Current.Cache.GetEnumerator();
while (enumerator.MoveNext())
{
if (enumerator.Key.ToString().Contains(_TableName))
{
try {
HttpContext.Current.Cache.Remove(enumerator.Key.ToString());
} catch (Exception) {}
}
}
}
这种用法会造成麻烦吗?