4

次の問題があります。この種のキャッシュ管理があります。

public class CacheManager : ICacheManager {

    private readonly ObjectCache cache;

    public CacheManager() {
        this.cache = MemoryCache.Default;
    }

    public void AddItem(string key, object itemToCache, double duration) {
        var end = DateTime.Now.AddSeconds(duration);
        this.cache.Add(key, itemToCache, end);
    }

    public T Get<T>(string key) where T : class {
        try {
            return (T)this.cache[key];
        }
        catch (Exception ex) {
            return null;
        }
    }

    public void Remove(string key) {
        this.cache.Remove(key);
    }
}

は非常に簡単です。

編集I(質問のテキストのバグ修正)

問題: いずれかのキーのキャッシュが期限切れになると、キャッシュ内のオブジェクトを取得するための次のすべての呼び出しが「null」を返します。私はキーをチェックし、常に正しいです。

この問題は PC のクライアントのサーバーでのみ発生し、サーバーは完全に動作します。

ありがとう。

エディットⅡ(上級編)

お客様のサーバーでアプリケーション プールを再起動すると、問題は数時間解決されます。

私たちのサイトには、次の設定を持つ特定のアプリケーション プールがあります。

パイプライン マネージャー モード: 統合フレームワーク: v4.0 32 ビット アプリケーションを有効にする: True。

デフォルトなどのその他の設定。

サーバーには 2 つのサイトがあり、1 つは「32 ビット アプリケーションを有効にする」が有効になっています。両方が無効になっている場合、エラーが発生しますが、これが問題かどうかはわかりません。

エディットⅢ(上級編)

問題の解決に失敗したため、Httpcontext.Current.Cacheに切り替えることにし、問題を解決することができました。別の解決策が必要で、引き続きMemoryCacheを使用しましたが、結果は得られませんでした。

4

2 に答える 2

1

古い質問を復活させますが、この問題は ASP.NET 4.5 でのみ修正されたバグによるものだと思いますが、以前のバージョンのホットフィックスがあります。

このスレッドを参照してください: MemoryCache Empty : 設定後に null を返します

于 2014-06-03T08:56:54.610 に答える
1

この種のキャッシュでは、通常、コードが「アイテムがキャッシュにない場合はアイテムを作成し、作成されたアイテムを使用してキャッシュに追加し、それ以外の場合はキャッシュからアイテムを使用する」という形式にする必要があります。したがって、アイテムがキャッシュにない場合、通常は問題になるはずです。

アイテムがキャッシュから消える一般的な理由は、メモリ使用量が多いことです。この場合、メモリ キャッシュは、アイテムがキャッシュに追加されるとすぐにアイテムを削除する可能性があります。この動作は、32 ビット (x86) で実行されているアプリケーション、特に大量の要求または大量のデータを処理するサーバーで非常に一般的です。

検証するには - メモリ コンピューターとプロセスのビット数を収集します。MemoryCache.CreateCacheEntryChangeMonitorと対応するイベントを使用して、キャッシュからのアイテムの削除をリッスンするコードを追加することを検討してください。

于 2012-04-21T04:21:48.000 に答える