【发布时间】:2016-06-21 20:21:22
【问题描述】:
首先我必须提到一些缓存的基础知识。如果要将对象缓存在堆外的内存中,则对象应该是可序列化的,因为它必须通过网络传输。因此,如果要缓存 Image Magic 对象,则必须将其转换为内存流,然后在读取它时再次将内存流转换为 Image 魔术对象。
但是,如果您想使用使用堆内存的 MemoryCache,您可以缓存每个对象而无需可序列化。
现在我的情况:我有两台 AWS 服务器,可托管 16 个带有负载均衡器的网站。所以我们在两个不同的网站上有 16 个相同应用程序的实例。我在 S3 上有超过 2000 张图片。目前我正在阅读它们并作为内存流,然后将它们转换为 Image 魔术并将其与用户图片结合起来,并向最终用户展示组合图像。为了提高性能,我必须缓存图像魔术图像并从缓存中读取它们,这消除了将内存流转换为图像魔术的时间,但是如果我使用 Memorycache 将有 16 个独立的应用程序池,所以很快内存就会满它不会有效,因为负载平衡器将在两台服务器之间分配请求。因此,如果第一个请求发送到服务器一并且 x 被缓存在那里,那么第二个请求将发送到服务器二然后再次将 x 缓存在服务器二中。如果我使用内存缓存,那么序列化就是问题所在。
附加信息:Web 应用程序在 MVC 中。
【问题讨论】:
-
您在哪个地区?你看过 AWS docs.aws.amazon.com/efs/latest/ug/whatisefs.html 的 EFS 吗?
-
查看this 页面以获得一些灵感。
-
2k 图像多久更改一次,为什么不将它们放在盒子本地?
-
我阅读了 EFS。它是一种存储系统,而不是缓存系统。我需要一个在服务器之间共享的缓存系统。 Memcache 在这里似乎是一个解决方案,但我需要序列化非常耗时的对象。
-
杰罗恩·海尔。谢谢。似乎我必须避免在多个服务器上进行内存缓存,因为 Microsoft 明确提到 here:“Redis 缓存是一种缓存解决方案,与 SQL 缓存相比,它可以为您提供高吞吐量和低延迟。此外,您应该避免使用多服务器环境中的内存实现(MemoryCache)。”
标签: c# asp.net-mvc caching memcached