Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在asp.net httpContext.Cache中存储/检索项的最有效方法是什么_Asp.net_Asp.net Mvc_Caching_Httpcontext.cache - Fatal编程技术网

在asp.net httpContext.Cache中存储/检索项的最有效方法是什么

在asp.net httpContext.Cache中存储/检索项的最有效方法是什么,asp.net,asp.net-mvc,caching,httpcontext.cache,Asp.net,Asp.net Mvc,Caching,Httpcontext.cache,我有一个网站,我在那里缓存了很多信息。我看到在asp.net缓存中存储内容时出现了相互冲突的信息 例如,假设我有以下数据结构: Dictionary<string, List<Car>> mydictionary; Dictionary-mydictionary; 我可以用字符串键将整个内容存储为“MyDictionary”,然后在拉出对象后向下搜索 HttpContext.Cache.Add("MyDictionary", mydictionary,

我有一个网站,我在那里缓存了很多信息。我看到在asp.net缓存中存储内容时出现了相互冲突的信息

例如,假设我有以下数据结构:

 Dictionary<string, List<Car>> mydictionary;
Dictionary-mydictionary;
我可以用字符串键将整个内容存储为“MyDictionary”,然后在拉出对象后向下搜索

 HttpContext.Cache.Add("MyDictionary",  
   mydictionary, 
   null, 
   Cache.NoAbsoluteExpiration,
   new TimeSpan(10, 0, 0),
   CacheItemPriority.Normal,
   null);

 var myDict = HttpContext.Cache["MyDictionary"] as Dictionary<string, List<Car>>;
HttpContext.Cache.Add(“MyDictionary”,
我的字典,
无效的
Cache.NoAbsoluteExpiration,
新的时间跨度(10,0,0),
缓存项优先级,正常,
无效);
var myDict=HttpContext.Cache[“MyDictionary”]作为字典;
我可以做的另一件事是将其分解,并将字典中的每个项分别存储在缓存中(假设缓存是一个字典)

Dictionary-mydictionary;
foreach(mydictionary.Keys中的var项)
{
HttpContext.Cache.Add(item,mydictionary[item],null,Cache.noabsoluteexpntiation,new TimeSpan(10,0,0),cacheitemriority.Normal,null);
}
var myitem=“测试”;
var myDict=HttpContext.Cache[myItem]作为列表;

性能含义会有很大不同吗(假设所有内容都在内存中?

到目前为止,第二种方法更好

认为必须考虑许多物体。每次你必须得到1个值,你只需要得到它,而不是抓住entyre字典,从中得到你想要的

这并不是说缓存中用于对最常用项进行优先级排序的算法(如果我还记得的话,请参阅MRU)


我建议您在将其作为最终实现之前,先用它来衡量性能增益。

正如您所说,在这方面有两种相反的观点

归根结底,缓存项应该按需要以最细粒度的级别存储。我的意思是,如果你每次使用字典中的每个条目,那么就将其存储在字典级别

如果您只使用字典中的一个项目,而不浏览字典,则将它们存储在单个级别

因此,如果将整个集合视为单个单元,则将其缓存为单个单元。如果该集合是随机访问的,并且一次只需要某些项目,则将其存储在单个单元的级别。

在这里添加一个额外的答案,因为我觉得现有的答案捕获了“什么”,但还不够“为什么”

最好在缓存中单独存储单个条目的原因与性能没有多大关系。相反,它必须允许系统执行适当的内存管理

ASP.NET缓存中有很多逻辑,可以确定在遇到内存压力时该怎么做。最后,它需要删除一些项目,并且需要以尽可能少的破坏性方式来完成。它选择剔除哪些项目取决于它们是否最近被访问。还有其他因素,比如缓存时传递的标志。e、 你可以使物品不可移动,而且永远不会被踢出

但是回到问题上来,如果您将整个字典存储为单个项,那么ASP.NET内存管理器只剩下两个选项:使整个字典保持活动状态,或者杀死整个字典。i、 e.您完全失去了将“热门”项目保留在缓存中的好处,而很少访问的占用内存的项目则被踢出缓存。换句话说,您将失去任何级别的缓存粒度


当然,您可以选择在字典中实现自己的方案来删除很少使用的项。但此时你正在发明轮子,而你的新轮子将无法正常工作,因为它无法与系统的其余部分协调。

请记住,缓存是一种节省重新创建常用
昂贵
对象成本的方法(即重新创建的成本超过了缓存的成本)。如果值得缓存,请允许缓存应用LRU规则以最大限度地提高性能。将所有条目放入一个缓存条目(“MyDictionary”)会使LRU失效,并且如果缓存决定保留MyDictionary的效率低于保留其他条目,则您可能会丢失全部内容。
 Dictionary<string, List<Car>> mydictionary;

 foreach (var item in mydictionary.Keys)
 {
      HttpContext.Cache.Add(item, mydictionary[item], null, Cache.NoAbsoluteExpiration, new TimeSpan(10, 0, 0), CacheItemPriority.Normal, null);
 }

 var myitem = "test";
 var myDict = HttpContext.Cache[myItem] as List<Car>;