Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET应用程序缓存中的大型对象_C#_Asp.net_Asp.net Mvc_Session_Caching - Fatal编程技术网

C# ASP.NET应用程序缓存中的大型对象

C# ASP.NET应用程序缓存中的大型对象,c#,asp.net,asp.net-mvc,session,caching,C#,Asp.net,Asp.net Mvc,Session,Caching,所以我刚继承了一个ASP.NET MVC应用程序 应用程序将用户权限缓存在应用程序缓存中,这很好,只是它将所有权限缓存在一个键下。它基本上是一个50MB的字典对象,里面有一堆嵌套的字典 每次请求时,50MB对象的访问方式如下: public bool HasAccess(string user, string permission) { var cache = (GodCache)MemoryCache.Default["GodCache"]); //I am huge return

所以我刚继承了一个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];
}

为什么这可能是个坏主意,最好的解释是什么?

一般来说,我认为将其分解为更小的对象比在缓存中有一个大对象要好。在内存压力下,缓存项将被逐出。如果缓存中有一个大型对象图作为单个项,那么整个对象将被逐出,您必须重新构建整个对象图,这将花费大量的时间和资源

相反,如果缓存被分解成更小的键值对,那么只有一些项将被逐出,并且可能需要更少的时间和资源来重新构造单个项


此外,如果缓存将成为进程外缓存(如redis),则会增加对象图序列化/反序列化的额外开销,并且在重载/并发负载下,对于一个大型对象,它可能会消耗大量CPU周期。

重构代码将是我的最佳猜测。“我这么说了”这可能是你能想出的唯一原因。为什么你认为从一开始就不好?我更大的目标是将我们的应用程序转换为使用Redis进行缓存(对还是错,这就是我想要做的)。在每次请求时从Redis中拉出50MB的对象是禁止的。让我的经理相信这只是一个糟糕的设计,这将强化我的观点。出现“上帝”一词意味着反模式。旁注:“编写代码的人都是十足的白痴”(你的理由听起来是这样的)很少是好方法。我不明白为什么您需要比您在评论中所说的更多的东西,“使用新的缓存技术,在每个请求上从远程缓存读取50M是缓慢的”是不够的。你可以考虑是否有更好的选择。