我有一个网站,在那里我缓存了很多信息。我看到关于在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>;
性能是否会有很大的不同(假设所有内容都在内存中)?
发布于 2012-04-09 12:17:06
正如您所说,在这方面有两种截然相反的观点。
归根结底,缓存条目可能应该在需要时存储在最细粒度的级别。我的意思是,如果你每次都使用字典中的每一个词条,那么就把它存储在字典级别。
如果您只使用字典中的一个条目,并且不遍历字典,则将它们存储在个人级别。
因此,如果您将整个集合视为单个单元,则将其作为单个单元进行缓存。如果集合是随机访问的,并且一次只需要某些项,那么在它是单个单元的级别上存储它。
发布于 2012-04-09 08:56:18
到目前为止,第二种方法更好。
想一想必须考虑许多对象。每次你必须得到一个值,你只需要得到它,而不是抓取入口字典,并从中获得你想要的东西。
这并不是说缓存中使用的算法对最常用的项目进行优先级排序(如果我还记得的话)。
我只是建议您在采用它作为最终实现之前,用它来测量性能增益。
https://stackoverflow.com/questions/9993840
复制相似问题