Windows Server AppFabric 缓存(微软分布式缓存解决方案)
主要介绍一下Windows Server AppFabric特点,详细的介绍及代码参照MSDN,这里就不多此一举了。(同类产品Memcahed)
Windows Server AppFabric 扩展了 Windows Server 以为 Web 应用程序和中间层服务提供增强的托管、管理和缓存功能。 AppFabric 托管功能向 Internet 信息服务 (IIS)、Windows Process Activation Service (WAS) 和 .NET Framework 4 添加了服务管理扩展。其中包括托管服务和托管管理工具,这些工具使部署、配置和管理基于 Windows Communication Foundation
(WCF) 和 Windows Workflow Foundation (WF) 的服务变得更加容易。 AppFabric 缓存功能向 Windows Server 添加了一个分布式的内存中对象缓存,它使扩展高性能 .NET 应用程序(特别是 ASP.NET 应用程序)变得更加容易。使用 AppFabric 缓存功能,您可以将多台计算机的内存容量合并到一个统一的缓存群集,从而可以帮助您轻松且低廉地扩展 .NET 应用程序。 这些功能包括缓存服务、缓存客户端和缓存管理工具。
Windows Server AppFabric 缓存物理体系结构示意图
Windows Server AppFabric 缓存功能使用彼此通信的服务器群集来形成单个统一的应用程序缓存系统。作为分配式缓存系统,所有缓存操作都抽象为单个参考点,称作缓存群集。换句话说,无论构成缓存群集的计算机有多少台,您的客户端应用程序都可以与群集中单个逻辑单元的缓存配合使用。
物理体系结构的主要组件包含缓存服务器、缓存主机 Windows 服务、缓存群集、基于 Windows PowerShell 的缓存管理工具、群集配置存储位置和缓存客户端。下图显示所有这些元素的关联情况。
AppFabric 缓存服务->缓存主机->缓存群集s
AppFabric 缓存服务 是运行在一个或多个服务器上的 Windows 服务
缓存服务器 运行缓存服务的每个服务器均
缓存群集 是以环状方式共同存储和分发数据的缓存服务的一个或多个实例的集合。
Windows Server AppFabric 缓存逻辑体系结构示意图
Windows Server AppFabric 中缓存群集的逻辑体系结构由命名缓存、区域和缓存对象组成。在下图中,命名缓存跨群集中的所有缓存主机,但区域仅限于群集中的一个缓存主机。
首先是命名缓存,其次命名缓存又可划分区域,区域是具体存数据的容器,缓存对象可增加标签帮助索引查找。
命名缓存 也称为缓存,是一个可配置的内存中存储单元,所有应用程序都使用该单元将数据存储在分布式缓存中。
区域 是可以放置在缓存中的附加数据容器。区域是一种缓存结构:它们不在群集配置设置中定义。区域是可选的;如果您想使用它们,必须借助应用程序代码通过使用 CreateRegion 方法在运行时明确创建它们。
缓存对象 采用其 System.Object 基类的形式,因此需要进行类型转换以将它们还原为其原始类型。
标签 在往缓存中添加对象时,可额外的为对象创建标签,以方便检索
总体比较:比Memcahed强大多了,但是配置复杂多了,依赖MS的东西也比较多。
基于 Windows PowerShell 的缓存管理工具
Windows PowerShell 是缓存服务的专用管理工具。Windows PowerShell 缓存管理 cmdlet 可以安装在任何域计算机上或缓存服务器上。通过安装 AppFabric 的缓存管理功能可以完成此操作。您必须具有对所有缓存服务器的管理员权限,才能使工具正常运行。
使用 Windows PowerShell 可启动和停止群集、添加和删除命名的缓存、更改配置设置,以及查看主机和群集的统计信息。
本地缓存
服务器采用序列化形式将对象存储在缓存中。当缓存客户端请求缓存中的某个对象时,服务器通过网络将该对象发送到客户端。然后,缓存客户端反序列化该对象以供客户端应用程序使用。若要加快检索某个对象的过程,请启用本地缓存。当启用本地缓存时,缓存客户端在本地存储对对象的引用。这将使对象在客户端应用程序的内存中保持活动状态。当应用程序请求对象时,缓存客户端首先检查对象是否位于本地缓存中。如果位于本地缓存中,则立即返回对该对象的引用,而不联系服务器。如果不在本地缓存中,则从服务器检索该对象。然后,缓存客户端反序列化该对象并将对此新检索到的对象的引用存储在本地缓存中。客户端应用程序也使用该对象。对象在本地缓存中的生存期取决于多个因素,如本地缓存中对象的最大数量以及失效策略。对于本地缓存,有两种类型的失效:基于超时的失效以及基于通知的失效。
本地缓存的对象存储在缓存客户端进程所在的同一进程空间中。当缓存客户端请求本地缓存的对象时,客户端将收到对本地缓存对象的引用,而非副本。对于可能从多个线程修改相同本地缓存对象的多线程应用程序而言,这是非常重要的注意事项。这些应用程序可以利用标准的 .NET Framework 编码技术从多个线程同步对象的更改。也可以为每个线程创建单独的 DataCacheFactory 对象。但是,应谨慎执行该操作,因为创建很多缓存工厂的开销可能会减少优势。
过期和逐出(Windows Server AppFabric 缓存)
缓存对象不会永久保留在 Windows Server AppFabric 的内存中。除了通过使用 Remove 方法从缓存中被显式删除之外,缓存对象也可能过期或被缓存群集逐出。
过期
缓存过期允许缓存群集自动将缓存对象从缓存中删除。当使用 Put 或 Add 方法时,可以为特定的缓存对象设置一个可选的对象超时值,该值将确定该对象在缓存中驻留的时间。如果在缓存对象时未提供对象超时值,则使用在命名缓存的群集配置设置中指定的值来确定该对象在缓存中的生存期。
当出于并发的目的锁定缓存对象时,即使这些对象过了其过期时间,也不会从缓存中被删除。一旦解锁这些对象,会立即将其从缓存中删除(如果过了其过期时间)。 为了防止在解锁过期对象时立即删除这些对象,Unlock 方法还支持延长缓存对象的过期时间。本地缓存失效
对于本地缓存,有两个互补类型的失效:基于超时的失效以及基于通知的失效。基于超时的失效
将对象下载到本地缓存之后,这些对象将驻留在本地缓存中,直到其达到缓存客户端配置设置中指定的对象超时值。达到此超时值之后,对象将失效,以便下次请求时可以从缓存群集刷新。
基于通知的失效
如果缓存客户端启用了本地缓存,则还可以使用缓存通知使本地缓存的对象自动失效。根据需要缩短这些对象的生存期,这样可以降低应用程序使用过时数据的可能性。
逐出
为了保持每个缓存主机上可用于缓存的内存容量,AppFabric 支持最近最少使用 (LRU) 逐出。阈值称为水印,用于确保内存在群集中的所有缓存主机之间均匀地分布。
配置化(结构类似MemCachedProvider,支持SessionState)
View
Code
<?xml version="1.0" encoding="utf-8" ?> <configuration> <!--configSections must be the FIRST element --> <configSections> <!-- required to read the <dataCacheClient> element --> <section name="dataCacheClient" type="Microsoft.ApplicationServer.Caching.DataCacheClientSection, Microsoft.ApplicationServer.Caching.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" allowLocation="true" allowDefinition="Everywhere"/> </configSections> <!-- cache client --> <dataCacheClient> <!-- cache host(s) --> <hosts> <host name="CacheServer1" cachePort="22233"/> </hosts> </dataCacheClient> <system.web> <sessionState mode="Custom" customProvider="AppFabricCacheSessionStoreProvider"> <providers> <!-- specify the named cache for session data --> <add name="AppFabricCacheSessionStoreProvider" type="Microsoft.ApplicationServer.Caching.DataCacheSessionStoreProvider" cacheName="NamedCache1" sharedId="SharedApp"/> </providers> </sessionState> </system.web> </configuration>
示例代码
View
Code
// Declare array for cache host(s). DataCacheServerEndpoint[] servers = new DataCacheServerEndpoint[1]; servers[0] = new DataCacheServerEndpoint("CacheServer2", 22233); // Setup the DataCacheFactory configuration. DataCacheFactoryConfiguration factoryConfig = new DataCacheFactoryConfiguration(); factoryConfig.Servers = servers; // Create a configured DataCacheFactory object. DataCacheFactory mycacheFactory = new DataCacheFactory(factoryConfig); // Get a cache client for the cache "NamedCache1". DataCache myDefaultCache = mycacheFactory.GetCache("NamedCache1"); //myDefaultCache.CreateRegion("Area1"); //create region
总体来看,默认支持asp.net sesseion配置,实现代码及配置文件都很简单,并且扩展了缓存区域及缓存标签功能,帮助划分区域及区分数据。尤其是本地缓存功能大大提高了检索效率(针对不变化数据),同时针对本地缓存过期也提供了过期和逐出机制。不过安装比较麻烦,建议使用Web PlatForm Instraller安装,里面会将指定的更新补丁及PowerShell一并下载更新了。相比Memcached功能强大,但没有Memcached配置和扩展简单,各有所长。
另外.NET 4.0支持缓存扩展,你可以继承ObjectCache实现自己的缓存机制。