Подтвердить что ты не робот

В чем разница между HttpContext.Current.Cache.Insert и HttpContext.Current.Cache.Add

Я работаю над веб-приложением ASP.NET, и я хочу реализовать кэширование, поэтому хочу узнать разницу между HttpContext.Current.Cache.Insert и HttpContext.Current.Cache.Add и какой из них лучше?

4b9b3361

Ответ 1

Основное различие между ними состоит в том, что если объект с таким именем уже существует в кеше, вызов метода Insert на ваш экземпляр Cache заменит объект, тогда как вызов метода Add будет fail (взято из Замечания абзаца методов Добавить и вставить на соответствующую страницу ссылок MSDN):

Добавить

Вызов этого метода завершится неудачно, если элемент с тем же ключевым параметром уже хранится в кеше. Чтобы перезаписать существующий элемент кэша используя тот же ключевой параметр, используйте метод Insert.

Вставить

Этот метод перезапишет существующий элемент кэша, ключ которого соответствует ключевой параметр.

Другое главное отличие состоит также в том, что с помощью метода Add некоторые параметры являются обязательными, тогда как при Insert доступны различные перегруженные методы, а некоторые параметры будут установлены на значения по умолчанию, такие как абсолютные или скользящие выходы.

Вы можете видеть, что нет никакой разницы между методом Add и Insert с теми же параметрами, за исключением того, что Insert не будет терпеть неудачу (т.е. ничего не делать), если объект с таким же именем находится в кеше.

Ответ 2

[EDIT] 2015-10-29 См. Комментарий Марка Соула ниже. UGH! [/EDIT]

Я только что разместил свои комментарии ниже по ссылке (замечания), которую предоставил Джалайн. Кто-нибудь здесь хочет прокомментировать? Любой, кто рассчитывает получить ошибку, пожалуйста, см. Мой последний абзац ниже и позор вам!:)

Будучи упрямым типом, я думал, что попробую. Я написал код, который выглядит примерно так.

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(в окне Immediate VS) в каждой точке и проверил, что на самом деле в кэш добавлен только один элемент. И foo.prop1 = "строка 6".

Кто-нибудь из Microsoft может объяснить, почему это НЕ выбрало исключение? Хотя это плохая практика (и наше приложение этого не делает), кто-то может рассчитывать на получение ошибки, и их приложение может вести себя не так, как ожидалось, потому что CLR не выдает ошибку, даже если ваша документация говорит об этом.

Ответ 3

Всегда неправильно понимается, что 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 ничего не возвращает.

Добавить метод примечания говорит, что он не обновляется. Я предполагаю, что это опечатка на странице добавления. Я думаю, что они хотели сказать: "Вызов этого метода не сможет обновить, если элемент с тем же ключевым параметром уже сохранен в кэше"

вы можете попробовать запустить этот код и убедиться в том, получаете ли вы какую-либо ошибку/исключение.
Cache.Add("Key1", "Value 1", null, DateTime.Now.AddSeconds(60), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null); (возвращает null)

Cache.Add("Key1", "Value 2", null, DateTime.Now.AddSeconds(60), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null); (возвращает значение "1" )