ASP.带有多个索引的.NET缓存

本文关键字:NET 缓存 索引 ASP | 更新日期: 2023-09-27 18:08:33

在我的DataCache中,我需要使用两个索引缓存对象。

如果我这样缓存:

Campaign campaign = //get campaign from db
HttpContext.Current.Cache.Add(
"Campaigns.Id."+campaign.Id.ToString(), 
campaign,
null,
System.Web.Caching.Cache.NoAbsoluteExpiration,
System.Web.Caching.Cache.NoSlidingExpiration,
System.Web.Caching.CacheItemPriority.Normal,
null);
HttpContext.Current.Cache.Insert("Campaigns.Code."+campaign.Code,
campaign,
null,
System.Web.Caching.Cache.NoAbsoluteExpiration,
System.Web.Caching.Cache.NoSlidingExpiration,
System.Web.Caching.CacheItemPriority.Normal,
null);

我尝试使用Id或代码"索引"访问缓存。如果没有找到,则检索活动并建立索引,如上所示。

这种方法会导致任何问题吗?

ASP可以决定只删除一个索引。如果我通过索引访问缓存,它会获取条目并重新索引,这没问题。

更新:

我的主要问题是我是否必须支付存储对象两次,或者如果它只是一个引用存储在缓存中的同一对象?

ASP.带有多个索引的.NET缓存

您可以通过使用CacheDependency对象来确保这两个条目被一起删除。下面是更新后的插入语句。这样就不再需要过期时间了。

HttpContext.Current.Cache.Insert(
  "Campaigns.Code." + campaign.Code, 
  campaign, 
  new CacheDependency(null, new [] {"Campaigns.Id."+campaign.Id.ToString()}));

但实际上这两种变体都可以。

编辑:您可能应该使第二个条目的插入依赖于添加第一个条目的成功。考虑这样一个场景:多个请求请求一个不在缓存中的对象。一个典型的种族。它们都创建了数据(好),其中一个可以成功调用Add(...)(好),但它们都可以成功调用Insert(...)(可能不好)。您最终可能会为两个索引返回不同的对象。

我建议对你的代码做如下修改:

Campaign campaign = //get campaign from db
string id = "Campaigns.Id." + campaign.Id.ToString();
object old = HttpContext.Current.Cache.Add(
    id, campaign, null,
    System.Web.Caching.Cache.NoAbsoluteExpiration,
    System.Web.Caching.Cache.NoSlidingExpiration,
    System.Web.Caching.CacheItemPriority.Normal,
    null);
if (old == null) {
    // the object was successfully added
    HttpContext.Current.Cache.Insert(
        "Campaigns.Code." + campaign.Code, 
        campaign, 
        new CacheDependency(null, new [] { id }));
}