0

プロジェクトに.NETC#を使用しています。

会社全体で使用されているため、キャッシュしたい製品のリストがあります。製品がキャッシュから脱落した場合、さまざまな機関/ブログサイトのパターンに従って、キャッシュをロックして再構築する方法をすでに知っています。

私のページ/ユーザーコントロールなどで、次のようにキャッシュへの参照を取得する場合があります。

var myCacheInstance = cachedProducts

ただし、次のようなこともしたいと思うかもしれません。

myCacheInstance.Add(new product(...));

同じオブジェクトであるため、キャッシュも更新されます。

2つのクエリがあります。

  1. キャッシュされたオブジェクトへの参照がある場合、変数の存続期間中、キャッシュに残ることが保証されていますか?
  2. 上で概説したscanarioで、整合性を確保するにはどうすればよいですか?このインスタンスで追加することだけを計画していますが、オブジェクトも更新および削除していたとしましょう。
4

3 に答える 3

1

1)キャッシュされたオブジェクトへの参照がある場合、変数の存続期間中、キャッシュに残ることが保証されていますか?

私がこの質問を正しく解釈すると、応答はノーです。

cache.Add("key", new object()); // ADD KEY
var obj = cache["key"];         // GET REFERENCE TO CACHED OBJECT
cache.Remove("key");            // REMOVE OBJECT FROM CACHE

obj.DoSomething(..);            //PERFECTLY VALID, STILL WORK ..

2)上記のスキャンリオで、整合性を確保するにはどうすればよいですか?このインスタンスで追加することだけを計画していますが、オブジェクトも更新および削除していたとしましょう。

boolたとえば、次のようなプロパティを追加できます。

public bool IsValid
{
    get; private set;
}

オブジェクトが削除されると、このプロパティはクラスからに設定されfalseます。ほんの一例ですが、それが本当にあなたのニーズに合っていれば、私たちにあなただけを伝えることができます。

于 2012-08-21T11:50:46.020 に答える
1

キャッシュへの参照を渡さないでください!

キャッシュにオブジェクトを使用し、クライアントがキャッシュされたアイテムにキャッシュされたアイテムの新しいリストまたは読み取り専用コレクションを返すようにしたい場合。アイテムをキャッシュに追加する場合は、キャッシュ オブジェクトでメソッドを使用し、そのメソッドでキャッシュをロックしてアイテムを追加します。削除も同様。

質問 1: 参照を渡す場合、何も保証できません。質問 2: 上記で説明したように、オブジェクトを使用してすべてのアイテムをキャッシュします。

public class Cache
{
  private List<Item> cachedItems = new List<Item>();

  public void Add(Item item)
  {
   lock(cachedItems)
   {
    cachedItems.Add(item);
   }
  }
}
于 2012-08-21T11:54:53.213 に答える
0

こんにちは、整合性を確保するために、キーを追加する必要があります

Cache.Add("YourKey", yourValue)

ここでは、すべての操作のヘルパーを見つけることができます

http://johnnycoder.com/blog/2008/12/10/c-cache-helper-class/

期間またはタイムアウトの場合、この形式があり、absoluteExpiration を指定します

public Object Add (string key, Object value, CacheDependency dependencies, 
DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority
priority, CacheItemRemovedCallback onRemoveCallback) 
于 2012-08-21T11:54:38.113 に答える