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

Owi*_*dat 33 c# asp.net caching

我工作的ASP.NET Web应用程序,我想实现缓存,所以我想知道之间的差别HttpContext.Current.Cache.InsertHttpContext.Current.Cache.Add与哪一个更好?

Jal*_*ayn 54

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

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

插入

此方法将覆盖其键与key参数匹配的现有缓存项.

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

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


And*_*itz 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];
Run Code Online (Sandbox Code Playgroud)

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

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


小智 5

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

缓存添加

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

缓存插入

如果您使用Insert方法将一个项目添加到缓存中,并且已经存在一个具有相同名称的项目,则替换缓存中的现有项目

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

添加方法的备注说无法更新。我想这是添加页面中的错字。我认为他们的意思是“ 如果在缓存中已经存储了具有相同关键参数的项目,对此方法的调用将无法更新

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

// 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);
Run Code Online (Sandbox Code Playgroud)