所以我刚刚继承了一个ASP.NET MVC应用程序......
该应用程序在应用程序缓存中缓存用户权限,这很好,除了它在单个密钥 下缓存 所有权限这一事实。它基本上是一个50MB的大字典对象,里面有一堆嵌套的字典。
在每个请求中,访问50MB对象如下:
public bool HasAccess(string user, string permission)
{
var cache = (GodCache)MemoryCache.Default["GodCache"]); //I am huge
return cache[user][permission];
}
为什么 可能是一个坏主意,最好的情况是什么?
答案 0 :(得分:2)
一般来说,我认为将其分解为较小的对象比在缓存中有1个巨大的对象更好。在内存压力下,缓存项将被驱逐。如果你有一个大对象图作为缓存中的单个项,那么整个对象将被逐出,你必须重新构建整个对象图,这将花费大量的时间和资源。
相反,如果缓存被分解为较小的键值对,那么只有一些项目将被逐出,并且可能需要更少的时间和资源来重新构建该单个项目。
此外,如果缓存将变为进程外缓存(如redis),则会增加对象图的seralization / deserialization的开销,并且在重/同时加载时它可能会消耗大量的一个巨大的对象的CPU周期。