2013-11-28 148 views
0

场景:ASP.Net服务器侧数据缓存

实现在内存中的ASP.Net应用程序的web场方案

    的WCF层的主数据的高速缓存
  1. 数据在第一次访问服务层时缓存,比如GetCountryList()方法的缓存'过期设置为午夜。比方说,缓存键是“CountryList_Cache”
  2. 随后的所有请求都通过缓存”
  3. 担任如果国家列表中使用主屏幕更新,那么额外的调用,以无效‘CountryList_Cache’和新鲜的数据加载到它
  4. 下一个电话现在收到更新的国家列表 上述步骤在单个服务器方案中很容易,因为步骤3只需要一个服务器的缓存过期呼叫。当我们有2个或3个负载均衡的Web服务器时,复杂度会增加,因为在这种情况下,缓存仅通过一台服务器更新(通过主屏幕),但必须在所有3台服务器上失效。

我们提出的解决方案:

我们打算有一个外部服务/ EXE /网页这将是了解所有负载均衡服务器(通过配置文件)。为了使特定的缓存失效,我们将调用这个外部组件,而这个外部组件又会使所有Web服务器上的相应缓存键无效,然后使用最新数据加载缓存。

问题:

虽然上述方法将为我们工作,我们不认为这是一个企业级的LOB应用程序干净的方法。是否有更好/更干净的方式来实现跨多个服务器的缓存过期?

注:

  1. 我们不希望使用分布式缓存,由于明显的性能损失,相比于进程内/内存缓存
  2. 缓存一直使用System.Runtime实现。缓存
  3. 我们已经与SQL依赖工作,在单个Web服务器

回答

1

您的设计相较于Windows Azure的角色内Cache和AppFabric的缓存的场景中使用它。

在这些产品中,缓存存储在一个或多个服务器(缓存集群)中。为了加快请求速度,他们创建了Local Cache

当启用本地缓存时,缓存客户端在本地存储对对象 的引用。该本地引用使对象在客户端应用程序的内存中保持活动状态 。当应用程序请求 该对象时,缓存客户端会检查该对象是否驻留在本地缓存的 中。如果是,则立即返回 而不与服务器联系。如果它不存在,则从服务器检索 对象。然后,缓存客户端 对对象进行反序列化,并将对这个新近检索到的对象的引用存储在本地缓存中。客户端应用程序使用这个 相同的对象。

本地缓存可以通过超时和/或通知将失效

Notification-based Invalidation

当您使用缓存通知,您的应用程序检查与定期间隔 缓存集群看看是否有新的通知 可用。这个间隔称为轮询间隔,默认情况下每隔012秒钟就会有300秒。轮询间隔在应用程序配置设置中以 秒为单位指定。请注意,即使使用基于通知的失效 ,超时仍然适用于 本地缓存中的项目。这使基于通知的失效互补 超时失效。