HttpContext.Current.Cache.Insert和HttpContext.Current.Cache.Add有什么区别

时间:2012-01-30 10:03:56

标签: c# asp.net caching

我正在开发一个ASP.NET Web应用程序,我想实现缓存,所以我想知道HttpContext.Current.Cache.InsertHttpContext.Current.Cache.Add之间的区别,哪一个更好?

3 个答案:

答案 0 :(得分:54)

两者之间的主要区别在于,如果缓存中已存在具有相同名称的对象,则Insert实例上的Cache方法调用将替换该对象,而Add 1}}方法调用将失败(取自各自MSDN参考页面上的方法的Remarks段添加和插入):

添加

  

如果具有相同键参数的项目,则对此方法的调用将失败   已存储在缓存中。覆盖现有的Cache项   使用相同的键参数,使用Insert方法。

插入

  

此方法将覆盖其键匹配的现有缓存项   关键参数。

另一个主要区别在于,使用Add方法时,某些参数是必需的,而使用Insert时,可以使用各种重载方法,并且某些参数将设置为默认值,如绝对值或滑动到期。

您可以看到Add和Insert方法之间没有区别,但是如果具有相同名称的对象在缓存中,则Insert不会失败(即不执行任何操作)。

答案 1 :(得分:9)

[编辑] 2015-10-29 请参阅下面的Mark Sowul的评论。啊! 的 [/编辑]

我刚刚在Jalayn提供的链接(备注)中发表了我的评论。这里有人关心评论吗?任何人指望得到一个错误,请看下面我的最后一段,并羞辱你! :)

作为顽固型,我想我会尝试一下。我写了一些看起来像这样的代码。

var myObject = new MyObjectType() { prop1 = "string 1", prop2 = 1 };
var cacheKey = "mycachekey";
var cTime = DateTime.Now.AddMinutes(11);
var cExp = System.Web.Caching.Cache.NoSlidingExpiration;
var cPri = System.Web.Caching.CacheItemPriority.Normal;

HttpContext.Current.Cache.Add(cacheKey, myObject, null, cTime, cExp, cPri, null);
myObject.prop1 = "string 2"; myObject.prop2 = 2;
HttpContext.Current.Cache.Add(cacheKey, myObject, null, cTime, cExp, cPri, null);
myObject.prop1 = "string 3"; myObject.prop2 = 3;
HttpContext.Current.Cache.Insert(cacheKey, myObject, null, cTime, cExp, cPri, null);
myObject.prop1 = "string 4"; myObject.prop2 = 4;
HttpContext.Current.Cache.Insert(cacheKey, myObject, null, cTime, cExp, cPri, null);
myObject.prop1 = "string 5"; myObject.prop2 = 5;
HttpContext.Current.Cache.Add(cacheKey, myObject, null, cTime, cExp, cPri, null);
myObject.prop1 = "string 6"; myObject.prop2 = 6;
HttpContext.Current.Cache.Insert(cacheKey, myObject, null, cTime, cExp, cPri, null);

var foo = (MyObjectType)HttpContext.Current.Cache[cacheKey];

猜猜是什么。它运行正常。我甚至在此代码块之前和之后设置了一个断点,并在每个点执行HttpContext.Current.Cache(在VS的立即窗口中)并验证实际上只有一个项目被添加到缓存中。并且foo.prop1 =“string 6”。

微软的任何人都在解释为什么这不会引发异常?虽然这是不好的做法(而且我们的应用程序没有这样做),但有人可能会指望抛出错误,并且他们的应用程序可能无法按预期运行,因为即使您的文档说它会发生错误,CLR也不会抛出错误。

答案 2 :(得分:5)

总是被误解,如果Cache.Add尝试添加具有相同参数的项目,则会抛出错误。它不会抛出任何错误/异常,或者它不会更新并且不会抛出任何错误。查看下面的msdn文章

  

Cache.Add

     

Add方法返回您添加到缓存中的对象。另外,如果   您使用Add方法并且已存在具有相同名称的项目   在缓存中,该方法不会替换该项,也不会引发   一个例外。   http://msdn.microsoft.com/en-us/library/18c1wd61(v=vs.100).aspx

     

Cache.Insert

     

如果使用Insert方法将项目添加到缓存和项目   具有相同名称的已存在,缓存中的现有项目是   取代

另一个区别是Cache.Insert有5个重载,Add只有一个。 Add方法返回该键下缓存中的对象(如果是新项,则为null,否则为当前缓存中的项),而Insert不返回任何内容。

添加方法' s remarks表示无法更新。我想这是添加页面的拼写错误。我认为他们的意思是"如果具有相同关键参数的项目已经存储在缓存中,则调用此方法将失败更新;

您可以尝试运行此代码,看看自己是否收到任何错误/异常。

// returns null
Cache.Add("Key1", "Value 1", null, DateTime.Now.AddSeconds(60), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);

// returns "Value 1"
Cache.Add("Key1", "Value 2", null, DateTime.Now.AddSeconds(60), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);