web-dev-qa-db-ja.com

.NET MemoryCacheのCacheItemPolicyを介してキャッシュされたアイテムを期限切れにする

CacheItemPolicyのAbsoluteExpirationプロパティについて混乱しています。

MSDNのドキュメント は、「キャッシュエントリが削除されるまでの期間」を示しています。 System.DateTimeOffsetを使用して「期間」を定義します。

しかし、 DateTimeOffsetのMSDNドキュメント を見ると、「特定の時点を表している...協定世界時(UTC)に関連している」と書かれています。これも参照 StackOverflowスレッド

あなたは問題を見ますか? AbsoluteExpirationは「期間」(5秒や2時間など)を期待しますが、「時点」(2012年12月21日、06:14:00 ESTなど)を表すオブジェクトが必要です。

以下のコードでは、すべてのアイテムに対して単一のポリシーを定義しています。すべてのアイテムが追加されてからcacheExpiryInSeconds秒後に期限切れになりたい。誰かがこれが正しい方法で行われていることを確認できますか?

public class MyCache : IRoutingInfoCache
{
    MemoryCache _routingInfoCache;
    CacheItemPolicy _cachePolicy;


    public MyCache(int cacheExpiryInSeconds)
    {
        _routingInfoCache = new MemoryCache("myCache");
        _cachePolicy = new CacheItemPolicy() {
            AbsoluteExpiration = 
                new DateTimeOffset(
                    DateTime.UtcNow.AddSeconds(cacheExpiryInSeconds))
        };
    }


    public void Put(string key, object cacheItem)
    {
        // based on how I constructed _cachePolicy, will this item expire
        // in cacheExpiryInSeconds seconds?
        _routingInfoCache.Add(new CacheItem(key, cacheItem), _cachePolicy);
    }
}
26
John Ruiz

キャッシングはUTC時間に準拠して均一な時間計算を提供するため、キャッシュされたエントリが期限切れになる時点をUTCで指定すると、キャッシュは適切な時間差を計算し、期待どおりに期限切れになります。

絶対有効期限はbeforeであるため、コードは期待どおりに機能しません。cacheExpiryInSeconds秒が経過するとキャッシュアイテムが入力され、結果としてimmediateが削除されます。近い将来AbsoluteExpirationが設定されている場合、CacheItemPolicyインスタンスを共有することはできません。 :)

17
Haney