代码改变世界

微软企业库4.1学习笔记(十六)缓存模块4 服务器场中的缓存使用

2010-04-23 23:38  Virus-BeautyCode  阅读(2318)  评论(3编辑  收藏  举报

  服务器场中的缓存使用

  单一的CacheManager不能跨应用程序域共享。服务端应用大多部署在多台服务器上,每台服务器的内存中都有一份缓存的数据。对于一台机器上面有多个进程,也是一样的,包括每个运行在自己的进程中的企业组件,每个进程都有一份缓存的数据。

  不同的应用不能使用同一个数据库作为后端存储,在同一个数据库作为不同的应用的后端存储,可能会导致不可预料的问题,不推荐这么做。

  当在多个进程中运行相同应用的时候(例如,应用被部署在服务器场的环境中),你可以选用下面的一种配置。

  1)所有的应用实例使用同一个数据库实例,但是应用的每个实例使用不同的数据库分区。

  2)所有的应用实例使用同一个数据库实例,同一个数据分区,所有的CacheManager都可以读写缓存。

  3)所有的应用实例使用同一个数据库实例,同一个数据分区,但是只能有一个CacheManager写缓存,所有的CacheManager都可以读缓存。

  1)分区缓存

  所有的应用实例使用同一个数据库实例,但是每一个应用实例使用不同的数据库分区。每个CacheManager的操作是独立的。尽管他们共享同一个后端存储,但是每个CacheManager管理的缓存数据的持久在不同的数据分区。当应用重启,每个CacheManager从自己的分区获取数据。

  如果应用预加载缓存,每个应用的实例都从原始的数据库获取数据。每个部署的应用实例预加载的数据都来自后端存储。意味着使用缓存,在多个进程中部署同一个应用,不比在多个进程中部署不同的应用高效多少。

  在多个服务器部署同一个应用,每个服务器上的配置是一样的,例如,所有的配置都是相同的过期策略。但是保证不了在每个分区中的数据是一样的。在后端数据分区存储的数据都是内存缓存的副本。内存中的缓存内容依赖于应用实例如何使用缓存,因为对应用的请求被路由的不同的服务器,在每个服务器上的内存缓存很有可能是不一样的。因此,后段分区的数据也很有可能是不一样的。意味着即使所有的应用关闭,然后同时重新启动,不保证在初始化缓存之后,从后端数据读取到缓存中的数据是一致的。

  2)共享分区

  所有的应用使用同一个数据库实例,同一个数据分区,所有的CacheManager都可以读写缓存。每一个应用实例操作的都是一个唯一的内存缓存。当应用创建一个CacheManager,CacheManager从后段存储中读取数据填充到内存缓存中。意味着如果应用在它启动的时候创建一个CacheManager,如果所有的应用实例同时启动,每个内存缓存会加载同样的数据。因为应用使用同一个分区,每个应用实例不需要额外的后端存储。

  数据只有在创建CacheManager的时候才从后端存储加载到内存缓存中,这之后,内存缓存中的内容根据应用使用缓存的情况变化。每个应用实例使用缓存的方式大不一样,因为请求被路由到不同的服务器。运行中的应用的不同实例在内存缓存中的内容是不一样的。

  

   随着应用增加删除数据,内存中缓存的数据会发生变化。用CacheManager移除缓存项,或者是发生过期清理的时候,内存中缓存的数据也会改变。内存中缓存数据发生了变化,CacheManager会更新后端存储的对应内容。后端存储不会在后端内容发生变化的时候通知CacheManager实例。因此,当一个应用实例改变后端存储中存放的内容的话,其他的应用实例对应的内存缓存就会和后端存储中的内容不一致。这意味着当应用重启之后,返回到内存缓存中的数据和在重启之前内存中缓存的数据不一致。

  CacheManager提供了一个事件,在缓存项过期之后可以通知应用。应用可以使用这个通知,从原始的数据源更新缓存中的数据。当应用更新缓存中的数据的时候,CacheManager也会更新对应的后端存储的内容。如果应用被部署在多个服务器上,每个应用的实例都会收到事件通知,然后向原始数据源请求同一个数据,对同一个数据形成多个请求。这样的请求,会对应用和原始数据源的性能造成消极的影响。因此,使用监测缓存数据的过期来通知应用更新数据的做法在本方案中不被推荐。

  3)单个只写

  所有的应用实例使用同一个数据库实例,同一个数据分区,但是只有一个CacheManager可以对缓存进行写操作。所有的CacheManager可以从缓存中获取数据。也就是同时只有一个应用实例可以对缓存进行写操作,其他的应用实例只能进行读操作。对缓存进行写操作的应用实例是master,master的内存中缓存的数据对后端存储来说总是唯一的。创建CacheManager之后,每个应用实例的内存中缓存的数据都是从后端存储中获取的。应用实例只能从缓存中读取一个数据的快照,因为它们没有能力更新缓存,这些应用实例的内存中缓存的数据会随着数据项的过期而变旧,变少。

  未完待续。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。