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可以决定只删除一个索引。如果我通过索引访问缓存,它会获取条目并重新索引,这没问题。
更新:我的主要问题是我是否必须支付存储对象两次,或者如果它只是一个引用存储在缓存中的同一对象?
您可以通过使用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 }));
}