1

多くのデータを照合するクエリを持つ C# WebAPI があります。その後、HttpRuntime キャッシュを使用して結果オブジェクトを 10 分間キャッシュします。問題は、キャッシュの有効期限が切れると、その人が 12 秒の負荷を受けることです。このアプリケーションは 3 つの配信サーバーを使用しており、分散キャッシュのオプションはありません。

.NET を使用すると、キャッシュの期限切れイベントを使用できますが、呼び出し元の要求に影響を与えずにそれを使用するにはどうすればよいでしょうか?

メインキャッシュが期限切れになった場合にそれにフォールバックし、5分ごとにポーリングして両方のキャッシュを更新するWindowsサービスなどを用意するために、キャッシュを期限切れにしないようにすることが1つの考えでした。

アイデア?

4

1 に答える 1

0

おそらく、結果を個別にページ キャッシュにキャッシュすると役立つでしょう。http://johnnycoder.com/blog/2008/12/10/c-cache-helper-class/に基づく

静的であるため、WCF を使用して自分のペースで更新できます。

httpではなく静的に変更しました

public static class CacheHelper
{
    public static void WriteOutCacheHelper()
    {
        foreach (KeyValuePair<string, object> cache in Cache)
        {
            Console.WriteLine(cache.Key);
        }
    }
    public static void WriteOutCacheHelper(string key)
    {
        Console.WriteLine(Get<object>(key).ToString());
    }

    public static bool Enabled { get; set; }

    private static Dictionary<string, object> _cache;
    public static Dictionary<string, object> Cache
    {
        get
        {
            if (_cache == null) _cache = new Dictionary<string, object>();
            return _cache;
        }
    }

    public static object lockObject = new object();
    public static void Add<T>(T o, string key) 
    {
        if (!Enabled) return;

        lock (lockObject)
        {
            if (Exists(key))
                Cache[key] = o;
            else
                Cache.Add(key, o);
        }
    }

    public static void Clear(string key)
    {
        if (!Enabled) return;

        Cache.Remove(key);
    }

    public static bool Exists(string key)
    {
        if (!Enabled) return false;
        return Cache.ContainsKey(key);
    }

    public static T Get<T>(string key) 
    {
        if (!Enabled) return default(T);

        T value;
        try
        {
            value = (!Exists(key) ? default(T) : (T) Cache[key]);
        }
        catch
        {
            value = default(T);
        }

        return value;
    }

    public static void ClearAll(bool force = false)
    {
        if (!force && !Enabled) return;
        Cache.Clear();
    }

    public static List<T> GetStartingWith<T>(string cacheKey) where T : class
    {
        if (!Enabled) new List<T>();

        return Cache.ToList().FindAll(f => f.Key.StartsWith(cacheKey, StringComparison.CurrentCultureIgnoreCase))
            .Select(s => s.Value as T).ToList();
    }
}
于 2013-09-10T23:25:01.683 に答える