多级缓存 - 与MemoryCahe的Appfabric

时间:2014-09-22 13:17:13

标签: c# caching memory .net-4.0 appfabric

在我目前的设置中,我有一个专用的Appfabric服务器。存储在那里的大多数对象都是引用对象,这意味着大多数操作都是“获取”操作。因此我考虑过使用LocalCache。 不幸的是,最近我遇到了各种网络问题导致的缓存服务器可用性问题。由于我编写了一个提供程序,应用程序服务器在这些情况下继续直接使用DB。但是,它对性能的影响非常大。

我希望能够为高度引用的对象使用某种本地缓存,即使缓存服务器已关闭也是如此。为此,我考虑使用.Net 4的MemoryCache。我并不真正关心过时的对象,我依赖于超时驱逐策略,因此我不担心应用程序服务器之间的同步。

我想听听您对此解决方案的看法。 - 我还应该考虑其他任何一点吗? - 即使缓存服务器已关闭,是否有更好的解决方案可以为高度引用的对象提供快速访问?

2 个答案:

答案 0 :(得分:0)

您考虑过AppFabric's local cache feature吗?或者它不适合你?

答案 1 :(得分:0)

Appfabric的LocalCache是​​客户端应用程序的本地和inproc客户端缓存,它存储常用数据的引用,因此应用程序不需要再次反序列化同一个对象。但是,由于LocalCache与缓存服务器一起使用,如果缓存服务器关闭,它将无法工作。

您的问题可能解决的一个问题就是您所提到的,具有独立的客户端缓存,因此即使缓存服务器出现故障,客户端缓存仍然可用。

当依赖inproc缓存时,您必须记住进程内缓存存储缓存对象的引用。如果您的应用程序在从缓存获取后修改了对象,它也将在缓存中进行修改。此外,如果多个线程可能最终修改缓存中的相同项,则需要对此类对象进行线程同步。

然而,即使使用独立的客户端缓存,您的应用程序也可能最终频繁访问数据库,因为一个应用程序服务器的客户端缓存中的数据将无法访问其他服务器。

更好的解决方案可能是使用replicated cache servers,其中每个服务器都将拥有所有缓存数据。这不仅可以提高参考数据的性能,还可以消除单点故障,就像您的情况一样。

如果Appfabric不是应用程序的硬性要求,您可以考虑NCache以获得更好的可扩展性和高可用性。