EntLib 3.1学习笔记(1) : Caching Application Block


[En]http://msdn2.microsoft.com/en-us/library/aa480456.aspx
[zh]http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/dnpag2caching1.mspx

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安装目录下)

    using Microsoft.Practices.EnterpriseLibrary.Caching;
    
using Microsoft.Practices.EnterpriseLibrary.Caching.Expirations;

(4) 使用Cache Application Block:

//保存
CacheManager cacheManager = CacheFactory.GetCacheManager(); //读取默认的CacheManager,CacheManager内部创建一个Cache对象,Cache内部维护一个Hashtable.
productsCache.Add(key, Value, CacheItemPriority.Normal, nullnew SlidingTime(TimeSpan.FromMinutes(5))); //Add内部有进行线程同步处理;如果Key已经存在,则先删掉再添加;如果容量超过预设值,将有BackgroundScheduler对象执行清理工作(每次清理掉numberToRemoveWhenScavenging个记录)。AbsoluteTime设置绝对过期时间,SlidingTime设置滑动的过期时间(两次被调用之间的时间间隔)。
//读取
object value = cacheManager.GetData(key); //如果Key不存在或已过期,则返回null
//删除
cacheManager.Remove(key);

 


5. 基于时间的过期策略/基于提醒机制的过期策略/条目移除的提示/装载缓冲/刷新缓冲
http://www.cnblogs.com/Terrylee/archive/2005/11/13/275233.html;

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 ^_^。


posted @ 2009-03-08 16:52  貔貅  阅读(334)  评论(0编辑  收藏  举报