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

Der*_*olt 0 c# caching asp.net-mvc-2

我想从数据库缓存内存中的字符串,这样我就不必每次都访问数据库.我尝试使用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);
}
Run Code Online (Sandbox Code Playgroud)

非常感谢.

Nat*_*son 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);
     }
}
Run Code Online (Sandbox Code Playgroud)

这是一个示例用例.该功能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;
}
Run Code Online (Sandbox Code Playgroud)

第一次运行此函数时,缓存将返回null,因为我们尚未向BlogPosts键添加任何内容.第二次调用该函数时,帖子将在缓存中,并且if块中的代码将不会运行,从而使我们无法访问数据库.