2016-06-21 66 views
0

首先,我必须提到缓存的一些基本知识。如果你想在一个内存中缓存一个对象,那么对象应该是可序列化的,因为它必须通过网络传输。因此,如果要缓存Image Magic对象,则必须将其转换为内存流,然后在读取它时再次将内存流转换为Image Magic对象。在多于一台服务器的内存中缓存图像

但是,如果您要使用使用堆内存的MemoryCache,则可以缓存每个没有可序列化的对象。

现在我的情况:我有两台AWS服务器,我们的网站有16个负载均衡器。所以我们在两个不同的网站上有16个相同应用程序的实例。我有超过2000张在S3上的照片。目前,我正在阅读它们并作为内存流,然后将它们转换为Image magic,并将其与用户图片结合起来,并向最终用户显示组合图像。为了提高性能,我必须缓存图像魔术图像并从缓存中读取它们,这会消除将内存流转换为图像魔术的时间,但如果我使用Memorycache,则会有16个隔离的应用程序池,因此很快内存就会满了,它不会有效,因为负载均衡器将在两台服务器之间分配请求。所以如果第一个请求到达服务器一个而x在那里被缓存,那么第二个请求到达服务器两个,然后再一次将x缓存在服务器二中。如果我使用memcache,那么序列化是问题。

附加信息:Web应用程序在MVC中。

+0

你在哪个地区?你从AWS看过EFS http://docs.aws.amazon.com/efs/latest/ug/whatisefs.html? – JamesKn

+1

看看[这个](https://docs.asp.net/en/latest/performance/caching/distributed.html)页面的一些灵感。 –

+0

2k图片多久变化一次,为什么不将它们放在本地的盒子里? – JamesKn

回答

0

我做了大量的研究。无法缓存堆中的对象,并将它们缓存在网络上而无需序列化它们。任何通过网络传输的对象都必须是可序列化的。所以这个问题没有解决方案,我们可以如何将图像放入不在堆中的缓存中。实际上你可以序列化图像并缓存它,但是没有必要这样做,因为它需要序列化和反序列化,这些序列化和反序列化在服务器上有很多过载。