В чем разница между HttpContext.Current.Cache.Insert и HttpContext.Current.Cache.Add - PullRequest
33 голосов
/ 30 января 2012

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

Ответы [ 3 ]

54 голосов
/ 30 января 2012

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

Добавить

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

Insert

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

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

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

9 голосов
/ 14 марта 2012

[РЕДАКТИРОВАТЬ] 2015-10-29 Смотрите комментарий Марка Совула ниже. UGH! [/ 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 (в окне Immediate VS) в каждой точке и проверил, что только один элемент был фактически добавлен в кэш. И foo.prop1 = "строка 6".

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

5 голосов
/ 30 сентября 2014

Всегда неправильно понимается, что 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 возвращает объект, который был в кеше под этим ключом (ноль, если новый элемент, иначе элемент, находящийся в данный момент в кеше), тогда как 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...