Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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
Asp.net HttpRuntime.Cache不适合web场?_Asp.net_Asp.net Mvc_Caching_Memcached - Fatal编程技术网

Asp.net HttpRuntime.Cache不适合web场?

Asp.net HttpRuntime.Cache不适合web场?,asp.net,asp.net-mvc,caching,memcached,Asp.net,Asp.net Mvc,Caching,Memcached,我听说HttpRuntime.Cache不适合用于web场。为什么呢?这个问题有哪些好的解决方法?我听说过和类似的产品,但我找不到任何显示基本用法的好的近期样品 该对象是的实例 根据缓存对象的MSDN文档: 每个应用程序域创建一个此类实例,并且 只要应用程序域保持活动状态,就保持有效 在webfarm上,您有多台机器处理站点负载,因此有时您的请求可能会转到机器a,有时可能会转到机器B,等等。如果您将某个内容粘贴到机器a的缓存中,然后您的下一个请求转到机器B,您将无法将其从缓存中取出。这就像您对I

我听说
HttpRuntime.Cache
不适合用于web场。为什么呢?这个问题有哪些好的解决方法?我听说过和类似的产品,但我找不到任何显示基本用法的好的近期样品

该对象是的实例

根据缓存对象的MSDN文档:

每个应用程序域创建一个此类实例,并且 只要应用程序域保持活动状态,就保持有效


在webfarm上,您有多台机器处理站点负载,因此有时您的请求可能会转到机器a,有时可能会转到机器B,等等。如果您将某个内容粘贴到机器a的缓存中,然后您的下一个请求转到机器B,您将无法将其从缓存中取出。这就像您对InProc的限制一样。要解决这个问题,您可以研究粘性会话。

服务器场中的HttpRuntime.Cache存在的一个问题是,缓存中的大部分数据将跨服务器复制

例如,假设您有一个电子商务站点,您将产品目录存储在缓存中(因为它很少更改),这需要2000万内存。如果您有5台web服务器,每个服务器的缓存中都会有自己的产品目录副本,总共使用1亿内存(20万台*5台服务器)。使用像memcached这样的共享缓存可以通过只存储缓存项的一个副本而不是5个副本(每个服务器一个副本)来消除这种浪费

另一个问题是缓存同步。同样,假设您在从数据库检索产品目录后将其缓存1小时。每个服务器的缓存中都可以有一个目录副本,该副本在不同的时间过期。当一台服务器上的缓存过期时,它可能会得到其他服务器还没有的更新数据


这可能会导致一种奇怪的用户体验,他们可能会在一个类别中看到50个产品,然后刷新页面,发送到另一个服务器,然后使用共享缓存看到51,再次刷新,再次看到50,等等,您不必担心这一点。

跨多个实例共享缓存不是比粘性会话更好吗?我同意。我该如何实现共享缓存?@tamasInagy-这超出了我在这里的回答范围。谷歌搜索“MeCasHelp.NET”似乎会产生一些好文章。考虑AppFrand。我目前在这方面:)