【问题标题】:Caching in C# to improve performance[ASP.Net MVC]在 C# 中缓存以提高性能[ASP.Net MVC]
【发布时间】:2018-09-04 13:29:08
【问题描述】:

我在控制器中有一个函数,它返回一个国家列表。我正在尝试在其中实现缓存..所以只有在服务器端为空时才会获取该列表。我找到了两种方法:

  1. 使用 OutputCache

     [OutputCache(Duration = 86400, Location = OutputCacheLocation.Server,VaryByParam ="none")]
     public function getelement(){
     //return list of country;
     }
    

但我无法测试它可能是因为客户端和服务器都是我自己。

  1. 使用 MemoryCache

     private static MemoryCache _cache = MemoryCache.Default;
    
    _cache.Add(cacheKey, obj, policy);//MemoryCache(String, NameValueCollection, Boolean)
    

我无法正确实施第二个。

有什么建议吗?

更新 1:

   ObjectCache cache = MemoryCache.Default;
            string cacheKey = "countrylist";
            var cacheObject = cache.Get(cacheKey);

            if (cacheObject == null)
            {
                cacheObject = getelement();//returns a list of string type
                CacheItemPolicy policy = new CacheItemPolicy();
                policy.AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(60);
                cache.Add(cacheKey, cacheObject, policy);

            }    

我无法使用 cacheObject 或访问现在属于对象类型的列表。

我尝试了以下解决方案:

1. var mylist = (from p in cacheObject.Cast<string>(IQueryable) select p).ToList();


2. List<string> mylist = cacheObject.AsQueryable().Cast<string>().Select(values).ToList();
 values.AddRange(mylist);

但我无法创建字符串类型列表:(

【问题讨论】:

  • 你想在哪一层添加一些缓存层?在控制器上?
  • 是的..在控制器上
  • OutputCache 的一个优点是能够进行客户端(即浏览器缓存) - 这意味着浏览器不需要从您的服务器请求资源。对你有用吗?
  • 我猜没有..因为我试图减少第一次页面加载时间..这不会有任何区别..最好将列表保存在服务器的缓存中
  • its better to save the list in server's cache OutputCache 可以两者(客户端和服务器缓存)。此外,它可以缓存在任何下游服务器上(例如代理 - msdn.microsoft.com/en-us/library/…)。另外,如果您稍后添加 CDN,您将再次获得改进的加载时间。老实说,如果您尝试缓存整个 http 请求,您应该强烈考虑OutputCache。这就是它的用途。

标签: c# asp.net-mvc caching


【解决方案1】:

MemoryCache.Default已经是静态的了,不需要再存储了。

你可以实现类似这样:

ObjectCache cache = MemoryCache.Default;
var cacheObject = cache.Get(cacheKey);

if (cacheObject == null)
{
    cacheObject = //do something to get it
    CacheItemPolicy policy = new CacheItemPolicy();
    policy.AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(2);
    cache.Add(cacheKey, cacheObject, policy);
}
return cacheObject;

更新

@mjwills 指出,如果您有一个网络场/负载平衡站点,每台服务器都将拥有自己的缓存,并且它们可能在服务器之间不同步(至少在到期期间)。你可能会接受,也可能不会。如果不考虑 NCache、Redis 或类似产品。

【讨论】:

  • 我有一个国家列表..如何设置缓存对象或缓存键?
  • cacheObject = &lt;your list of countries&gt;; 。如果您不想在调用者中强制转换,也可以将其设为通用方法并返回 (T)cacheObject。
  • 和缓存键?它是一种字符串。
  • 是的,cachekey 是您引用缓存中对象的方式。请务必使用逻辑且唯一的值,因为如果为不同的缓存对象重复使用键,可能会出现细微的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 2022-06-16
相关资源
最近更新 更多