2013-09-10 2 views
1

У меня есть веб-приложение C#, у которого есть запрос, который сопоставляет много данных. Впоследствии я использую кеш HttpRuntime для кэширования объекта результата в течение 10 минут. Проблема в том, что, когда срок действия кеша истекает, этот человек получает 12-секундный груз. Это приложение использует 3 сервера доставки, и у нас нет возможности распределенного кеша.Обновить кеш приложения до истечения срока действия в C#

Используя .NET, мы можем использовать событие с истекшим сроком действия кэша, но как лучше всего использовать это, не затрагивая вызывающий запрос?

Предполагалось, что кеш-ресурс никогда не заканчивается, поэтому, если основной кеш истек, отмените его, затем получите службу Windows или подобное, которое каждые 5 минут проверяет, чтобы обновить оба кеша.

Идеи?

ответ

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(); 
    } 
} 
Смежные вопросы