0

だから今、私は責任を引き継いでいるプロジェクトに参加しています。

途中で実装されていることがわかった部分の 1 つは、サービス レイヤー キャッシュです。どうやら、サービス レイヤーのこのキャッシュは、データベース クラスターでの大量の呼び出しを回避するために実装されたようです。1 つのサーバーがダウンした場合のパフォーマンスと安定性のために、サービス レイヤーは 2 つのサーバーでホストされます。

さて、私の問題ですが、時限キャッシュの実装に最適なパターンは何ですか? 国などのようにめったに変更または更新されないオブジェクトはキャッシュされ、プールがリセットされない限り実際に解放されることはありません。

私たち、または私の前任者は、2 台の別々のマシンに 2 つのアクティブなサービスを持っているため、時間制限のあるキャッシュを実装することを考えています。別の方法として、サービスが互いに通信するようにすることもできますが、もちろん、サービスが互いに依存していないことを考慮して、一方がダウンしても他方が正常に機能するようにします。

現在、アイテムがキャッシュされている辞書は 12 個あります。これらのほとんどはめったに更新されません。これらのディクショナリは、シングルトンではなくシングルトンとして実装されている 1 つのクラスに存在するため、一度だけインスタンス化されます。

この興味深い問題を解決するためにどのようにアドバイスしますか? また、その理由は何ですか?

4

3 に答える 3

1

次のキャッシュ テクノロジのいずれかを使用して、1 つまたは複数のサーバーで構成されるキャッシュ クラスターをセットアップしてみませんか。

これにより、2 つのサービスが同じことを実行することを心配する必要がなくなります。

これらのテクノロジーはどちらも、指定された時間のオブジェクトのキャッシュをサポートしています。

例えば:

public void Add(string key, object value, TimeSpan timeout)
{
    //...
}

または、無期限にキャッシュすることもできます。

冗長性がサポートされています。ただし、小さな活字に注意してください。

AppFabric の冗長性

2010 年に、私は AppFabric と NCache についていくつかの記事を書きました。

どちらも、操作が簡単で類似した API を提供します。

于 2012-06-05T10:40:52.860 に答える
1

MemCachedは別のものです。MemCached は、説明したような分散アーキテクチャを対象としています。私はPaul Glavicによって書かれたアダプターを使用しています。彼はここにその使用方法を示す投稿を書いています。

Glavs アダプターを使用すると、将来的にキャッシュの実装を Aspnet キャッシュから MemCached または AppFabric に切り替えることができます。

アダプターは、ICacheProvider の形式で便利な API も提供します。

var data1 = cacheProvider.Get<SomeData>("cache-key", DateTime.Now.AddHours(1), () =>
{
    // With the cache disabled, this data access code is executed every attempt to
    // get this data via the CacheProvider.
    var someData = new SomeData() { SomeText = "cache example1", SomeNumber = 1 };
    return someData;
});
于 2012-06-05T10:47:36.550 に答える