web-dev-qa-db-ja.com

HttpContext.Current.Cache.InsertとHttpContext.Current.Cache.Addの違いは何ですか

ASP.NET Webアプリケーションで作業しており、キャッシュを実装したいので、HttpContext.Current.Cache.InsertHttpContext.Current.Cache.Addの違いを知りたいのですが、どちらが良いですか?

33
Owidat

2つの主な違いは、同じ名前のオブジェクトが既にキャッシュに存在する場合、Insertのインスタンスに対するCacheメソッド呼び出しがオブジェクトを置き換えるのに対して、Addメソッド呼び出しは失敗します(MSDNリファレンスページのメソッドAddおよびInsertの 備考 段落から取得):

追加

同じキーパラメータを持つアイテムが既にキャッシュに保存されている場合、このメソッドの呼び出しは失敗します。同じキーパラメータを使用して既存のキャッシュアイテムを上書きするには、Insertメソッドを使用します。

挿入

このメソッドは、キーがキーパラメータと一致する既存のキャッシュアイテムを上書きします。

もう1つの主な違いは、Addメソッドではいくつかのパラメーターが必須であるのに対し、Insertではさまざまなオーバーロードメソッドが利用可能であり、一部のパラメーターは絶対値またはスライドのようなデフォルト値に設定されることです有効期限。

同じ名前のオブジェクトがキャッシュ内にある場合、挿入が失敗しない(つまり何もしない)ことを除いて、まったく同じパラメーターを持つAddメソッドと Insert メソッドの間に違いはないことがわかります。

54
Jalayn

[編集] 2015-10-29以下のマーク・ソウルのコメントをご覧ください。うーん! [/ 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のイミディエイトウィンドウで)を実行し、実際に1つのアイテムのみがキャッシュに追加されたことを確認しました。そして、foo.prop1 = "string 6"。

マイクロソフトの誰もがなぜこれが例外をスローしなかったのかを説明しますか?それは悪い習慣ですが(そして、私たちのアプリケーションはそれを行いません)、誰かがエラーをスローすることを期待しているかもしれません。

9
Andrew Steitz

Cache.Addは、同じパラメーターを持つアイテムを追加しようとするとエラーをスローするというのは常に誤解されています。エラー/例外はスローされず、更新もエラーもスローされません。以下のmsdnの記事をご覧ください

Cache.Add

Addメソッドは、キャッシュに追加したオブジェクトを返します。さらに、Addメソッドを使用し、同じ名前のアイテムが既にキャッシュに存在する場合、メソッドはアイテムを置き換えず、例外を発生させません。 http://msdn.Microsoft.com/en-us/library/18c1wd61(v = vs.100).aspx

Cache.Insert

Insertメソッドを使用してアイテムをキャッシュに追加し、同じ名前のアイテムが既に存在する場合、キャッシュ内の既存のアイテムが置き換えられます

もう1つの違いは、Cache.Insertには5つのオーバーロードがあり、Addには1つのオーバーロードしかないことです。また、Addメソッドは、そのキーの下のキャッシュにあったオブジェクトを返します(新しいアイテムの場合はnull、そうでない場合は現在キャッシュにあるアイテム)。Insertは何も返しません。

Addメソッドの 備考 は、更新に失敗したことを示します。追加ページのタイプミスだと思います。彼らが言いたいことは、「同じキーパラメータを持つアイテムが既にキャッシュに保存されている場合、このメソッドの呼び出しは失敗しますto update

このコードを実行して、エラー/例外が発生するかどうかを確認してください。

// 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);
5