Enterprise Library Step By Step系列(十):缓冲应用程序块——进阶篇

Enterprise Library Step By Step系列(十):缓冲应用程序块——进阶篇

作者:Terrylee


一.基于时间的过期策略

基于时间的过期策略,支持两种相对时间和绝对时间。

1.绝对时间(Absolute):

允许您定义一个缓冲项的生命周期,我们可以指定一个单一的时间作为过期,或者通过表达式来设置。

指定单一的时间作为过期:

 1///读取数据
 2            Database db = DatabaseFactory.CreateDatabase("Database Instance");
 3            DataSet ds = db.ExecuteDataSet(CommandType.Text,"Select * from Products");
 4            
 5            ///创建CacheManager
 6            IsolatedCacheManager = CacheFactory.GetCacheManager("Isolated Cache Manager");
 7            
 8            ///创建一个单一的时间
 9            DateTime refreshTime = new DateTime(20051112125130);
10
11            ///指定为绝对过期时间
12            AbsoluteTime expireTime = new AbsoluteTime(refreshTime);
13            
14            ///添加缓冲项,优先级为Normal
15            IsolatedCacheManager.Add("MyDataSet",ds, CacheItemPriority.Normal, null,expireTime);

用表达式来设置:

表达式的格式:<Minute> <Hour> <Day of month> <Month> <Day of week>

例子:

“* * * * *”       expires every minute

“5 * * * *”       expire 5th minute of every hour

“* 21 * * *”      expire every minute of the 21st hour of every  day

“31 15 * * *”    expire 3:31 PM every day

“7 4 * * 6”       expire Saturday 4:07 AM

“15 21 4 7 *”  expire 9:15 PM on 4 July

 1///读取数据
 2            Database db = DatabaseFactory.CreateDatabase("Database Instance");
 3            DataSet ds = db.ExecuteDataSet(CommandType.Text,"Select * from Products");
 4            
 5            ///创建CacheManager
 6            IsolatedCacheManager = CacheFactory.GetCacheManager("Isolated Cache Manager");
 7            
 8            ///创建基于表达式
 9            ExtendedFormatTime expireTime = new ExtendedFormatTime("0 0 * * 6");
10            
11            ///添加缓冲项,优先级为Normal,过期时间
12            IsolatedCacheManager.Add("Key1""Cache Item1", CacheItemPriority.Normal,null, expireTime);

2.变化的时间:

允许您定义针对条目的被调用的两次之间的间隔,定义条目的生命周期

 1///读取数据
 2            Database db = DatabaseFactory.CreateDatabase("Database Instance");
 3            DataSet ds = db.ExecuteDataSet(CommandType.Text,"Select * from Products");
 4            
 5            ///创建CacheManager
 6            IsolatedCacheManager = CacheFactory.GetCacheManager("Isolated Cache Manager");
 7            
 8            ///访问5分钟后过期,变化的时间
 9            TimeSpan refreshTime = new TimeSpan(050);
10            SlidingTime expireTime = new SlidingTime(refreshTime);
11            
12            ///添加缓冲项
13            IsolatedCacheManager.Add("Key1""Cache Item1", CacheItemPriority.Normal,null, expireTime);

二.基于提醒机制的过期策略:

下面以文件依赖为例

1///依赖于文件DependencyFile.txt
2            ///当文件改变时过期

3            FileDependency expireNotice = new FileDependency("DependencyFile.txt");
4            
5            ///添加缓冲项
6            myCacheManager.Add("FileKey""String: Test Cache Item Dependency", CacheItemPriority.Normal, null, expireNotice);

可以创建自己的过期类,需要实现 ICacheItemExpiration接口

三.条目移除的提示:

        Caching Application Block 提供了项目移除的提醒,并在一下情况下被激活

    条目过期了

    条目被显式的移除了

    条目被策略的清楚了

        需要实现 ICacheItemRefreshAction接口

        一个类实现了 ICacheItemRefreshAction 接口,同时如果需要后端存储时,还必须被标识为 Serializable (Especially for persistent backing store)

1    [Serializable]
2    public class ProductCacheRefreshAction : ICacheItemRefreshAction
3    {
4        public void Refresh(string key, object expiredValue, CacheItemRemovedReason removalReason)
5        {
6            //……
7        }

8    }

四.装载缓冲:

1.缓冲的前期装载(Proactive loading):应用启动时装载

1)优点

        全部装载后,应用运行性能提升明显

2)缺点

        启动时间长

        可能带来不必要的资源浪费 

        为了提升启动性能而进行的——基于不同线程的装载,有造成了应用结构的复杂性

3)何时使用主动装载(Proactive caching)

在一些情况下中,他们自己有更新周期。当装载到缓冲将导致状态过期的出现

此时,您需要清楚的知道被缓冲的对象的生命周期

您还需要提前知道占用资源的程度

使用不稳定的资源时,尽量多使用主动装载缓冲

4)主动装载实例:

 1CacheManager productsCache = CacheManager.GetCacheManager(); 
 2/// 获取数据
 3ArrayList list = dataProvider.GetProductList(); 
 4
 5/// 添加缓冲项for (int i = 0; i < list.Count; i++) 
 6

 7    Product product = (Product) list[i]; 
 8    productsCache.Add( product.ProductID, product ); 
 9
10

2.缓冲的被动装载(Reactive loading):按需装载

1)优点

        只有在需要的时候才装载,对资源的需求小

2)缺点

        但是在首次装载的时候,速度慢

3)何时使用被动装载

需要缓冲的对象状态过多或系统资源不足的情况

资源的可靠性和性能良好,此时被动装载的又是更明显

希望利用缓冲机制,但是在应用程序的初始化时,希望不使用缓冲,而是根据用户输入等条件,进行缓冲

4)被动装载实例:

 1CacheManager productsCache = CacheManager.GetCacheManager(); 
 2Product product = (Product) productsCache.GetData(productID); 
 3if (product == null
 4
 5    /// 
 6    product = dataProvider.GetProductByID(productID);
 7    if (product != null
 8    
 9       productsCache.Add(productID, product); 
10    }
 
11}
 
12

五.刷新缓冲(Explicit flushing):

1.精确刷新:

使用代码——Initiated by application code

全部移除——Removes all items from the cache

2.自我移除(Scavenging):

使用应用程序块的功能——Initiated by application block

基于优先级和最后访问的时间——Based upon priority and last access time

控制移除的精确度——Configuration settings control size of cache and number removed

自我清除的配置:

MaximumElementsLnCacheBeforeScavenging:缓冲中的最大元素数量。。

NumberToRemoveWhenScavenging:一次移除的数量。

为缓冲建立优先级

 1/// <summary>
 2        /// 缓冲的优先级有以下几个值:
 3        /// --Low
 4        /// --Normal
 5        ///    --High
 6        ///--NotRemovable
 7        /// </summary>
 8        /// <param name="sender"></param>
 9        /// <param name="e"></param>

10        private void button2_Click(object sender, System.EventArgs e)
11        {
12            for(int intCount=0; intCount<8; intCount++)
13            {
14                string strKeyName = "Key"+System.Convert.ToString(intCount);
15                
16                if (intCount%2 == 0)
17                {
18                    myCacheManager.Add(strKeyName, "High", CacheItemPriority.High, nullnull);
19                }

20                else
21                {
22                    myCacheManager.Add(strKeyName, "Low", CacheItemPriority.Low, nullnull);
23                }

24            }

25        }

 

posted on 2005-11-13 13:21 TerryLee 阅读(4550) 评论(22)  编辑 收藏 所属分类: Enterprise Library

评论

#1楼  2005-11-13 16:53 sdfsdf [未注册用户]

继续关注....   回复  引用  查看    

#2楼 [楼主] 2005-11-13 17:23 Terrylee      

@sdfsdf

后面的我尽快写完:)   回复  引用  查看    

#3楼  2005-11-13 19:51 高海东      

支持   回复  引用  查看    

#4楼  2005-11-13 22:51 极速 [未注册用户]

就喜欢你这种写作风格。连载!
哈哈继续关注!   回复  引用  查看    

#5楼 [楼主] 2005-11-14 08:22 Terrylee      

@高海东,极速

非常感谢二位的支持

我尽力写好每一篇随笔

等写完企业库后,也许我会写Web Service系列(目前只在计划阶段)^_^   回复  引用  查看    

#6楼  2006-01-08 11:51 Jeffrey Lee [未注册用户]

关于提醒机制的过期策略这方面没有详细说明。

TO Terrylee: 应该写明大部分内容是摘自 WebCast 的。

我记得 WebCast 上面也是没有提到如何自己创建用于提醒的类,只说了实现接口和需要序列化。根本没有具体例子。有的话只是关于.txt文件更新的提醒。   回复  引用  查看    

#7楼  2006-07-22 12:25 dudu      

感谢Terrylee!
在使用缓冲应用程序块时,这篇文章给我带来了帮助!   回复  引用  查看    

#8楼 [楼主] 2006-07-23 09:43 TerryLee      

@dudu

dudu老大客气了,也谢谢老大的支持,有了你的支持,倍感温暖^_^   回复  引用  查看    

#9楼  2006-09-04 17:28 藤条焖猪肉[匿名]      

@Jeffrey Lee
更多的来自: Effective User Of Microsoft Enterprise Library 一书。
绝大部分都是翻译过来的,并从中提取要点,可以帮助新手快的入门。
同时,希望Terry可以讲些,在使用过程中可能遇到的问题与解决方法,以及在实际场景中用EntLib时的最佳实践,共享项目经验,对于已了解过的人来讲,评论比原文更精彩!

支持,Terry Lee!

更期待,讲解对EntLib的扩展,可以写出你已知的在Gotdotnet或其他人对企业库的扩展的功能,如:对Configuration AB,在上面提到的书中已有实际BinaryFormatTransfomer,好让大家对已有的扩展不用做重复工作.   回复  引用  查看    

#10楼 [楼主] 2006-09-05 17:28 TerryLee      

@藤条焖猪肉[匿名]
Effective User Of Microsoft Enterprise Library这本书也是比较基础的

关于Enterprise Library最近应该不会再写了,还是等3.0出来吧,呵呵   回复  引用  查看    

#11楼  2006-09-22 09:17 PIAO [未注册用户]

能否实现在自定义的Windows服务中缓存数据,然后应用程序去访问该缓存数据呢??这样只要启动服务,应用程序就可以提高性能了!-_-   回复  引用  查看    

#12楼  2006-09-26 08:50 evaellis [未注册用户]

急想问一下,怎么配置成磁盘缓存,不是放到数据库中,   回复  引用  查看    

#13楼  2007-11-28 17:42 RyanYu      

大致看一下,有空再细品   回复  引用  查看    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-11-13 13:24 编辑过
 
另存  打印
最新IT新闻:
· 阿里巴巴确立未来十年战略规划 修改自身定位
· 微软高管:Wii用户最终会成为Xbox 360用户
· 遵守YouTube案裁定 谷歌将陷入隐私指控深渊
· iPhone入华在即 中国手机产业生存面临考验
· 阿里巴巴集团再向淘宝注资20亿元
 





导航

公告

  • 网名:TerryLee
  • 本名:李会军
  • 位置:中国北京 Ethos
  • 联系方式:
  • 个人主页

 MVP配置

 版权声明

  • 本站采用创作共用许可 署名,非商业

绿色通道

IT新闻

统计

与我联系

留言簿(311)

我的标签

随笔分类

随笔档案

个人站点

关注项目

好的网站

我的好友