It supports both an in-memory cache and, optionally, a backing store that can either be the database store or isolated storage. The application block can be used without modification; it provides all the needed functionality to retrieve, add, and remove cached data.
1. 解决的问题:
(1) 性能:通过存储与数据使用者尽可能接近的相关数据,缓存可以提高应用程序的性能。这样可以避免重复进行数据创建、处理和传输;(2) 可伸缩性:在缓存中存储信息有助于节省资源,并且可以随着应用程序需求的增加来提高可伸缩性;(3) 可用性:通过将数据存储在本地缓存中,应用程序可以承受系统的故障,例如网络等待时间、Web 服务问题以及硬件故障;2. 适用场景:(1) 必须重复访问静态数据或极少更改的数据;
(2) 数据访问(创建、访问或传输)的开销很高;(3) 即使在源(例如服务器)不可用时,数据也必须始终可用;3. 可以使用Cache Block的应用程序包括:
(1) Windows Forms (2) Console application (3) Windows service (4) COM+ server (5) ASP.NET Web Application或Web Service(如果我们觉得Asp.net内置的Cache不能满足需求时)应该将缓存应用程序块部署在单个应用程序域中(You should deploy the Caching Application Block within a single application domain.)。每个应用程序域可以有一个或多个缓存(可以有也可以没有后备存储)。缓存不能在不同的应用程序域之间共享。
缓存应用程序块的性能已优化,并且是线程安全和异常安全的。可以对它进行扩展,以包括您自己的过期策略(expiration policies)和后备存储(backing store)。4. 使用步骤:
(1) 使用Enterprise Library Configuration打开应用程序配置文件(app.config或web.config)(2) 右键->New->Cache Application Block,并修改其中的参数并保存: ExpirationPollFrequencyInSecond:指过期轮询周期,就是多长时间就检查一下有哪些缓存项过期了,由后台独立进程执行。这个参数很关键,如果时间设置的太短,就会使这个后台进程不断执行,占用大量CPU时间,如果太长,又会浪费内存,要找个不长不短的,推荐用性能计数器监测一下,选一个适中的参数。 MaximumElementsLnCacheBeforeScavenging:缓冲中的最大元素数量。 Name:Cache Manage的名字,可以创建多个Cache Manage,以使用不同的缓冲策略。 NumberToRemoveWhenScavenging:一次移除的数量,其值必须小于MaximumElementsLnCacheBeforeScavenging,否则当达到最大元素数据后继续添加时,会出现添加不成功。(3) 添加引用:Microsoft.Practices.EnterpriseLibrary.Caching.dll(位于EntLib安装目录下)(4) 使用Cache Application Block:
5. 基于时间的过期策略/基于提醒机制的过期策略/条目移除的提示/装载缓冲/刷新缓冲;
6. Cache Application Block的设计:
7. 还没有搞明白的地方:(1) 使用In-Memory Cahce时,Cache(HashTable)放在哪儿?我在asp.net中测试,一个Client端向Cache中写数据,另一个Client可以取得数据。放在Session?不能,不同的Client不能共享!放在Asp.net的Cache?貌似不能,asp.net可能会由于内存紧张而不定时地清除数据!放在Application中?也不太像,Cache Block是一个在Winform/ConsleApp/Com+Server等中通用的Block!难道是放在一个独立的AppDomain中,像上面说的:应该将缓存应用程序块部署在单个应用程序域中(You should deploy the Caching Application Block within a single application domain.),但我运行CacheQuickStart示例,使用Sysinternals中的Process Explorer工具查看,只有一个AppDomain,并没有其他的AppDomain....(2) NumberToRemoveWhenScavenging的值大于MaximumElementsLnCacheBeforeScavenging时,当达到最大元素数据后继续添加时,会删掉所有元素(这个可以理解),并且添加不成功(原因还没有找出来)。所以我们在设置这两个值时,一定要保证NumberToRemoveWhenScavenging<MaximumElementsLnCacheBeforeScavenging ^_^。