2012-06-13 13 views
8

MemoryCacheの汎用的な代替/実装はありますか?System.Runtime.Caching.MemoryCacheの汎用実装

私は、MemoryCacheがHashtableをフードの下で使用していることを知っています。したがって、Hashtableの汎用バージョンであるDictionary <>を使用することになります。

これは、型の安全性を提供し、ボクシング/ボックス解除なしのパフォーマンス上の利点を提供します。

EDIT:私が興味を持っている別のものは、異なるキータイプです。デフォルトはSystem.Stringです。

+0

は、しかし、あなたは唯一のことができると思います1つのタイプをキャッシュする?私はこれをあまりにも多くのコストを心配することはありません、ボクシングの部分は非常に基本的な値の種類に無視されます。 –

+0

@AdamHouldsworth:はい、それが意図されています。私は1つだけのタイプを返すスライディング有効期限を持つデータベースマップ上にキャッシュをラッピングしています。 – caesay

+0

そのタイプは値タイプですか? –

答えて

13

MemoryCacheの一般的な代替/実装はありますか?

基本クラスライブラリにはありません。個人的には私が個人的には、あなたが望むAPIを提供するMemoryCacheのラッパーを作成するだけで、自分自身をロールバックする必要があります。

これは、型の安全性は、ラッパークラスではかなり容易に取り扱うことができていないボクシング/アンボクシングとして

を型の安全性を提供し、パフォーマンス上の利点を提供します。ボクシング/アンボクシングは、値の型(クラスではない)を格納していてもそれが最小限に抑えられている場合にのみ問題になります。キャッシュを頻繁にプッシュしたりプルしたりすることはほとんどありません問題。型の安全性と使いやすさについては

、私は実際にAPIの観点からビットよりよい使用を可能にする一般的な方法MemoryCache項目の呼び出しをラップするために自分自身のメソッドを書きました。これは非常に簡単です。通常、次のようなメソッドが必要です。

public T GetItem<T>(string key) where T : class 
{ 
    return memoryCache[key] as T; 
} 

同様に、同じ方法で値を設定する方法を作成できます。

EDIT:私が興味を持っている別のものは、異なるキータイプです。デフォルトはSystem.Stringです。

これはMemoryCacheで直接サポートされていないため、独自のキー生成を行うにはかなりの労力が必要です。 1つのオプションは、タイプセーフなラッパーを作成することです。Func<T, string>には、値に基づいて文字列キーを生成する機能があります。これにより、タイプTのキャッシュエントリを生成できます。ただし、比較の一環として必要な文字列にすべてのデータを含めるように注意する必要があります。

+0

私はボクシング/ unboxingが有効な関心事だと思う - あなたが実際に値の型をキャッシングしている場合。キャッシュを使用する主な理由の1つは、高い頻度で値を計算しているためです。したがって、キャッシュが多くヒットする一般的な状況になります。たぶん、ボクシングの高価なために十分なヒットを得るのは珍しいケースですが、それはあなたのアプリケーションがGC圧力にどれほど敏感であるかによって異なります。 –

関連する問題