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

前端之家收集整理的这篇文章主要介绍了在asp.net httpContext.Cache中存储/检索项目最有效的方法是什么前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个网站,我缓存了很多信息。我在asp.net缓存中存储东西时看到有冲突的信息。

例如说我有这样的数据结构:

Dictionary<string,List<Car>> mydictionary;

我可以用“MyDictionary”的字符串键存储整个东西,然后在我拉出对象时向下钻取。

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

 var myDict = HttpContext.Cache["MyDictionary"] as Dictionary<string,List<Car>>;

我可以做的另一件事就是把它分解出来,将每个项目分别存储在缓存中(给出缓存是一个字典)。

Dictionary<string,List<Car>> mydictionary;

 foreach (var item in mydictionary.Keys)
 {
      HttpContext.Cache.Add(item,mydictionary[item],null);
 }

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

表现意义是否会非常不同(假设我假设一切都在记忆中?)

解决方法

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

最好将单独条目存储在缓存中的原因与perf无关。相反,它与允许系统执行适当的内存管理有关。

在ASP.NET缓存中有很多逻辑来弄清楚当它运行到内存压力时该怎么做。最后,它需要踢出一些项目,它需要以最小的破坏性方式做到这一点。选择哪些项目可以踢出来,这取决于最近是否被访问了很多。还有其他因素,比如在缓存时间里传递的标志。例如你可以使一个物品不可移动,它永远不会被踢出来。

但是回到这个问题,如果你把整个字典存储成一个单独的项目,你只需要把两个选项留给ASP.NET内存管理器:保持整个事物的存在,或者杀死整个事情。即您完全失去了将“热”项目保留在缓存中的好处,而您很少访问的内存占用项目被踢出。换句话说,你失去任何级别的缓存粒度。

当然,您可以选择在字典中实现自己的方案来删除很少使用的项目。但是在这一点上,您正在重新创造轮子,而且您的新车轮将不会奏效,因为它不会与系统的其余部分协调。

猜你在找的asp.Net相关文章