ローカル・キャッシュは、特定の.NETアプリケーションに対してローカルである(つまりアプリケーション内に完全に含まれる)キャッシュです。ローカル・キャッシュの特に興味深い属性について、次に示します。
ローカル・キャッシュは、リモート・キャッシュが実装するものと同じ標準キャッシュ・インタフェースを実装します(ICache、IObservableCache、IConcurrentCache、IQueryCacheおよびIInvocableCache)。つまり、使用するキャッシュがローカルであってもリモートであっても、プログラミング上の違いはありません。
ローカル・キャッシュのサイズは制限できます。つまり、ローカル・キャッシュでは、キャッシュするエントリ数を制限し、キャッシュがいっぱいになったらエントリを自動的に削除できます。さらに、エントリのサイジングとエビクション・ポリシーの両方をカスタマイズできます。たとえば、キャッシュされたエントリで使用されるメモリーに基づいてキャッシュ・サイズを制限できます。デフォルトのエビクション・ポリシーでは、対数曲線で測定された、最も頻繁に使用する(MFU)情報と最後に使用した(MRU)情報の組合せを使用して削除するキャッシュ項目が決定されます。このアルゴリズムは、短期キャッシュと長期キャッシュの両方に対して十分に機能し、頻度と新しさのバランスをとってキャッシュ・スラッシングを回避するため、最適な汎用エビクション・アルゴリズムであるといえます。また、ピュアLRUアルゴリズムおよびピュアLFUアルゴリズムがサポートされ、カスタム・エビクション・ポリシーのプラグイン機能もサポートされています。
ローカル・キャッシュはキャッシュ・エントリの自動失効をサポートしています。つまり、キャッシュ内の各キャッシュ・エントリにTTL値を割り当てることができます。さらに、定期的または事前に設定した時刻にフラッシュするようキャッシュ全体を構成できます。
ローカル・キャッシュはスレッド・セーフで、高い並行性を備えています。
ローカル・キャッシュでは、キャッシュのget統計が提供されます。ここには、キャッシュ・ヒットおよびキャッシュ・ミスの統計情報が保持されます。これらの実行時統計を使用すれば、キャッシュの有効性を正確に推定できるため、キャッシュ実行時にサイズ制限や自動失効の設定を適宜調整できます。
Coherence for .NETのローカル・キャッシュ機能は、Tangosol.Net.Cache.LocalCacheクラスによって実装されます。したがって、このキャッシュはプログラムでインスタンス化して構成することが可能ですが、Coherence for .NETの他のキャッシュ同様、LocalCacheはキャッシュ・コンフィギュレーション・ディスクリプタを使用して構成することをお薦めします。
ローカル・キャッシュの主要な構成要素は<local-scheme>です。ローカル・キャッシュは通常、ニアスキームのフロント層としてなど、他のキャッシュ・スキーム内にネストされています。したがって、この要素はcoherence-cache-configファイルの次の要素のいずれかのサブ要素として記述できます。<caching-schemes>、<distributed-scheme>、<replicated-scheme>、<optimistic-scheme>、<near-scheme>、<versioned-near-scheme>、<overflow-scheme>、<read-write-backing-map>および<versioned-backing-map-scheme>の各要素です。
<local-scheme>には、キャッシュの特性を定義できるいくつかのサブ要素がオプションで用意されています。たとえば、<low-units>および<high-units>サブ要素はキャッシュのサイズを制限します。キャッシュが最大許容サイズに達すると、指定されたエビクション・ポリシー(<eviction-policy>)に従って削除対象エントリが決定され、指定されたより小さなサイズに戻ります。エントリおよびサイズの制限は、該当するスキームの単位換算カリキュレータ(<unit-calculator>)で計算される単位で測定されます。
キャッシュの有効期間も制限できます。<expiry-delay>サブ要素は、前回の更新からエントリが期限切れとしてマークされるまでの、キャッシュでエントリが保持される期間を指定します。期限切れのエントリを読み取ろうとすると、構成済のキャッシュ・ストア(<cachestore-scheme>)からのエントリのリロードが発生します。期限切れになった値は、フラッシュ遅延に基づいてキャッシュから定期的に破棄されます。
<cachestore-scheme>が指定されていない場合、キャッシュされたデータはメモリー内に存在して、キャッシュに対して実行された操作を反映するだけになります。使用可能なすべてのサブ要素の詳細は、「<local-scheme>」を参照してください。
例16-1に、ローカル・キャッシュの構成を示します。その他の例については、「キャッシュ・コンフィギュレーションのサンプル」を参照してください。
例16-1 ローカル・キャッシュの構成
<?xml version="1.0"?>
<cache-config>
<caching-scheme-mapping>
<cache-mapping>
<cache-name>example-local-cache</cache-name>
<scheme-name>example-local</scheme-name>
</cache-mapping>
</caching-scheme-mapping>
<caching-schemes>
<local-scheme>
<scheme-name>example-local</scheme-name>
<eviction-policy>LRU</eviction-policy>
<high-units>32000</high-units>
<low-units>10</low-units>
<unit-calculator>FIXED</unit-calculator>
<expiry-delay>10ms</expiry-delay>
<flush-delay>1000ms</flush-delay>
<cachestore-scheme>
<class-scheme>
<class-name>ExampleCacheStore</class-name>
</class-scheme>
</cachestore-scheme>
<pre-load>true</pre-load>
</local-scheme>
</caching-schemes>
</cache-config>
すべてのINamedCache実装のインスタンスは、LocalCacheを含め、不要になった時点でINamedCache.Release()メソッドをコールして明示的に解放し、これらのインスタンスで保持されているリソースをすべて解放する必要があります。
特定のINamedCacheがアプリケーションの継続期間を通して使用される場合、リソースはそのアプリケーションがシャットダウンされたとき、または停止したときにクリーンアップされます。ただし、わずかの間だけ使用される場合は、使い終わった時点でアプリケーションからRelease()メソッドをコールする必要があります。
または、INamedCacheがIDisposableを拡張し、すべてのキャッシュ実装がIDisposable.Dispose()のコールをINamedCache.Release()に委任しているという事実を利用する方法もあります。つまり単一メソッド内でキャッシュ・インスタンスを取得および解放する必要がある場合、次のusingブロックを使用してそれを実現できます。
例16-3 ローカル・キャッシュへの参照の取得と解放
using (INamedCache cache = CacheFactory.GetCache("my-cache"))
{
// use cache as usual
}
usingブロックが終了すると、INamedCacheインスタンスでIDisposable.Dispose()がコールされ、そのインスタンスに関連付けられているすべてのリソースが解放されます。