c# netcore HttpContext.Current.Cache.Insert와 HttpContext.Current.Cache.Add의 차이점은 무엇입니까?




.netcore redis (3)

ASP.NET 웹 응용 프로그램에서 일하고있어 캐싱을 구현하고자하므로 HttpContext.Current.Cache.InsertHttpContext.Current.Cache.Add 사이의 차이점을 알고 싶습니다. 그리고 어느 것이 더 낫습니다.


동일한 매개 변수를 가진 항목을 추가하려고하면 Cache.Add가 오류를 던질 것이라는 사실을 항상 오해하고 있습니다. 오류 / 예외를 throw하지 않거나 업데이트하지 않으며 오류를 throw하지 않습니다. 아래의 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는 아무 것도 반환하지 않습니다.

메서드의 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);

[편집] 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 = "문자열 6".

Microsoft의 누군가가 왜 예외가 발생하지 않았는지 설명합니다. 비록 실용적이지는 않지만 (우리의 응용 프로그램은 그렇지 않습니다) 누군가가 오류가 발생하는 경우가 많을 수 있습니다. 따라서 CLR이 문서에 오류가 있음에도 불구하고 응용 프로그램이 예상대로 작동하지 않을 수 있습니다.


두 가지 주요 차이점은 캐시에 이미 같은 이름의 개체가 있으면 Cache 인스턴스에서 Insert 메서드 호출이 개체를 대체하지만 Add 메서드 호출이 실패합니다 (메서드의 Remarks 단락에서 가져옴) 각 MSDN 참조 페이지에 추가 및 삽입) :

더하다

동일한 키 매개 변수를 가진 항목이 이미 캐시에 저장되어 있으면이 메소드 호출은 실패합니다. 동일한 키 매개 변수를 사용하여 기존 캐시 항목을 덮어 쓰려면 Insert 메서드를 사용합니다.

끼워 넣다

이 메서드는 키가 key 매개 변수와 일치하는 기존 캐시 항목을 덮어 씁니다.

다른 주요 차이점은 Add 메서드를 사용하면 일부 매개 변수가 필수이고 Insert 하면 다양한 오버로드 된 메서드를 사용할 수 있으며 일부 매개 변수는 절대 또는 슬라이딩 만료와 같은 기본값으로 설정된다는 것입니다.

동일한 이름을 가진 객체가 캐시에 있으면 Insert가 실패하지 않는다는 것 (즉, 아무 것도하지 않음)을 제외하고는 정확히 동일한 매개 변수를 사용하여 Add와 Insert 메소드 사이에 차이가 없음을 알 수 있습니다.





caching