MVC 2 - Кэширование строк в памяти - PullRequest
0 голосов
/ 30 января 2011

Я хотел бы кэшировать строки в памяти из базы данных, чтобы у меня не было доступа к базе данных каждый раз.Я пытался использовать System.Runtime.Caching, но, похоже, не работает.

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

Есть ли способ исправить вышеуказанную проблему?Ниже приведена часть моего кода:

using System.Runtime.Caching;

ObjectCache cache = MemoryCache.Default;

public bool CacheIsSet(string key)
{
    return cache.Contains(key);
}

public object CacheGet(string key)
{
    return cache.Get(key);
}

public void CacheSet(string key, object value)
{
    CacheItemPolicy policy = new CacheItemPolicy();
    cache.Set(key, value, policy);
}

Большое спасибо.

1 Ответ

6 голосов
/ 30 января 2011

Вы должны ссылаться на объект HttpRuntime.Cache. Я создал обертку вокруг этого, похожую на ту, на которую вы ссылались в своем вопросе. Не стесняйтесь использовать его:

using System.Web.Caching;

public class CachingService
{
     protected Cache Cache
     {
         get;
         set;
     }

     public int CacheDurationMinutes
     {
         get;
         set;
     }

     public CachingService()
     {
         Cache = HttpRuntime.Cache;
         CacheDurationMinutes = 60;
     }

     public virtual object Get(string keyname)
     {
         return Cache[keyname];
     }

     public virtual T Get<T>(string keyname)
     {
         T item = (T)Cache[keyname];

         return item;
     }

     public virtual void Insert(string keyname, object item)
     {
         Cache.Insert(keyname, item, null, DateTime.UtcNow.AddMinutes(CacheDurationMinutes), Cache.NoSlidingExpiration);
     }

     public virtual void Insert(string keyname, object item, CacheDependency dependency)
     {
         Cache.Insert(keyname, item, dependency);
     }

     public virtual void Remove(string keyname)
     {
         Cache.Remove(keyname);
     }
}

Вот пример использования. Функция LoadPosts предназначена для загрузки сообщений в блоге для отображения на сайте. Функция сначала увидит, кэшированы ли записи, если нет, загрузит записи из базы данных, а затем кеширует их:

public IEnumerable<BlogPost> LoadPosts() 
{
  var cacheService = new CachingService();
  var blogPosts = cacheService.Get<IEnumerable<BlogPost>>("BlogPosts");

  if (blogPosts == null)
  {
     blogPosts = postManager.LoadPostsFromDatabase();
     cacheService.Insert("BlogPosts", blogPosts);
  }

  return blogPosts;
}

При первом запуске этой функции кэш вернет null, поскольку мы еще ничего не добавляли в ключ BlogPosts. Второй раз, когда вызывается функция, сообщения будут находиться в кеше, а код в блоке if не будет запущен, что спасет нас от поездки в базу данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...