web-dev-qa-db-ja.com

HttpContext.Cacheの有効期限

データがHttpContext.Cacheに保持される期間を指定する方法はありますか?

33
Micah

Cache.Add()の4番目のパラメーターで指定できます。

public Object Add(
    string key,
    Object value,
    CacheDependency dependencies,
    DateTime absoluteExpiration,  // After this DateTime, it will be removed from the cache
    TimeSpan slidingExpiration,
    CacheItemPriority priority,
    CacheItemRemovedCallback onRemoveCallback
)

編集:

インデクサーを介してキャッシュにアクセスする場合(つまり、Cache["Key"])、呼び出されたメソッドは有効期限を使用せず、キャッシュに無期限に残ります。

インデクサーを使用するときに呼び出されるコードは次のとおりです。

public void Insert(string key, object value)
{
    this._cacheInternal.DoInsert(true, key, value, null, NoAbsoluteExpiration, NoSlidingExpiration, CacheItemPriority.Normal, null, true);
}
33
John Rasch

次のようなCache.Addメソッドを使用します。-

 HttpContext.Cache.Add("mykey", someObj, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 15, 0), CacheItemPriority.Normal, null);

上記は、最後にアクセスしてから15分で期限切れになります。または、Cache.NoSlidingExpirationをこのパラメーターに渡して、前のパラメーターで特定のDateTimeを使用することもできます。

17
AnthonyWJones

はい、データがキャッシュに保持される期間を指定する方法はありますが、前の2つの例のいずれも、の2つの時間ベースのパラメーターのいずれかを使用して経過した予想時間の間アイテムを保持することを実際に保証するものではありません。メソッドを追加します(絶対有効期限またはスライド有効期限)。

キャッシュは単なるキャッシュであり、その目的は物事をスピードアップすることです。したがって、データが保持されることを期待するべきではなく、データがない場合は常にフェッチする準備をしておく必要があります。

ご存知かもしれませんが、アイテムには依存関係があり、期限が切れていなくても、それに基づいて期限切れになります。これは簡単な概念ですが、それほど簡単ではない別の概念があります。優先順位。

アイテムの優先度に基づいて、メモリの負荷と相まって、計算に基づいて十分な有効期限でデータをキャッシュしているが、そのデータを2回以上使用することはできない状況に陥ることがあります。このような状況では、キャッシュは単なるオーバーヘッドです。

編集:私はあなたが必要な時間の間アイテムを実際に保持する実際の方法を指定するのを忘れました、そしてそれは望ましい時間ベースの有効期限を選択し、依存関係をまったくなく、手動で削除せず、そして使用することの産物ですNotRemovable優先度。これは、inprocセッション状態が内部的にhttpruntimeキャッシュに保持される方法でもあります。

4
user134706