我有一个网站,我缓存了很多信息。我在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内存管理器:保持整个事物的存在,或者杀死整个事情。即您完全失去了将“热”项目保留在缓存中的好处,而您很少访问的内存占用项目被踢出。换句话说,你失去任何级别的缓存粒度。
当然,您可以选择在字典中实现自己的方案来删除很少使用的项目。但是在这一点上,您正在重新创造轮子,而且您的新车轮将不会奏效,因为它不会与系统的其余部分协调。