HttpContext.Current.Cache.Insert和HttpContext.CCurrent.Cache.

本文关键字:HttpContext Cache CCurrent Insert Current | 更新日期: 2023-09-27 18:21:47

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

HttpContext.Current.Cache.Insert和HttpContext.CCurrent.Cache.

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

添加

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

插入

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

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

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

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

我刚刚在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="字符串6"。

微软有谁愿意解释为什么这没有引发异常?尽管这是一种糟糕的做法(我们的应用程序没有这样做),但有些人可能指望抛出错误,而他们的应用程序可能不会像预期的那样运行,因为CLR不会抛出错误,即使您的文档中说会抛出错误。

人们总是误解Cache.Add在尝试添加具有相同参数的项时会抛出错误。它不会抛出任何错误/异常,或者它不会更新,也不会抛出任何误差。查看下面的msdn文章,上面写着

缓存.添加

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

缓存.插入

如果使用Insert方法将项添加到缓存和具有相同名称的项已存在,缓存中的现有项为更换

另一个区别是缓存。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);