ASP.NET缓存对象是读写的

时间:2009-01-23 20:49:01

标签: asp.net caching

如果用户尝试读取 HttpContext.Current.Cache [key] 而另一个尝试删除对象 HttpContext.Current.Cache.Remove(key)同时?

考虑一下数百名用户从缓存中读取并尝试同时清理一些缓存对象。会发生什么,它是否安全?

是否可以在缓存中创建数据库感知业务对象?

3 个答案:

答案 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。

我想我们在这里遗漏了一些东西。让我解释一下我的意思,你可以告诉我它是否正确。

  1. UserA检查缓存中的对象 (“resultA”)并没有找到它。
  2. UserA运行查询。结果是 缓存为“resultA”5分钟。
  3. UserB检查缓存中的对象 (“resultA”)并找到它。
  4. UserB使用缓存对象“resultA”
  5. 如果是这种情况,那么您不需要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) {}
    }
  }
}

这种用法会造成麻烦吗?