C# 具有多个索引的ASP.NET缓存

C# 具有多个索引的ASP.NET缓存,c#,linq-to-sql,C#,Linq To Sql,在我的数据缓存中,我需要使用两个索引缓存一个对象 我这样说: 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.NoSlidingExpira

在我的数据缓存中,我需要使用两个索引缓存一个对象

我这样说:

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或代码“index”访问缓存。如果找不到,则检索活动并为其编制索引,如上所示

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

ASP可以决定只删除其中一个索引。如果我通过该索引访问缓存,它将再次获取该项并重新索引,这没关系

更新:


我的主要问题是,我是否需要为存储两次对象付费,或者它是否只是对存储在缓存中的同一对象的引用?

您可以使用
缓存依赖关系
对象确保两个条目一起删除。这是更新后的insert语句。这使得过期时间不再必要

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 }));
}

谢谢你的意见。我使用lock语句来避免竞争条件,如果一个索引被删除而另一个索引没有被删除,这也不是什么大问题。我主要关心的是是否需要为存储对象两次付费,或者如果两个索引只引用对象?@Niels只要两个缓存项都指向同一个对象图(请参见上面的竞态条件),您就只能保持一个对象处于活动状态。缓存本身只存储一个引用。谢谢,这就是我要找的。