MVC 2 - 缓存内存中的字符串

时间:2011-01-30 05:48:45

标签: c# asp.net-mvc-2 caching

我想从数据库缓存内存中的字符串,这样我就不必每次都访问数据库。我尝试使用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 个答案:

答案 0 :(得分:6)

您应该引用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块中的代码将不会运行,从而使我们无法访问数据库。