gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:59:33 25 4
gpt4 key购买 nike

我有一个网站,我缓存了很多信息。我看到有关在 asp.net 缓存中存储内容的信息相互矛盾。

例如,假设我有这个数据结构:

 Dictionary<string, List<Car>> 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>>;

我可以做的另一件事是将它分解并将每个项目分别存储在我的字典中的缓存中(假设缓存无论如何都是字典)。
 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>;

性能影响是否会有很大不同(假设我假设一切都在内存中?)

最佳答案

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

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

ASP.NET 缓存中有很多逻辑可以弄清楚当它遇到内存压力时该怎么办。最后,它需要踢出一些项目,并且需要以尽可能少的破坏性方式执行此操作。它选择踢出哪些项目很大程度上取决于它们最近是否被访问过。还有其他因素,例如在缓存时传递的标志。例如你可以使一个项目不可移动,它永远不会被踢出。

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

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

关于asp.net - 在 asp.net httpContext.Cache 中存储/检索项目的最有效方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9993840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com