Enterprise Library 缓存应用程序块到期和清理处理的设计

到期处理的设计

缓存应用程序块的到期处理由 BackgroundScheduler 来执行。它周期性的检查哈希表中的 CacheItem 看是否有条目已过期。在使用配置控制台配置一个 CacheManager 实例时可以控制到期周期发生的频率。

缓存应用程序块提供了四个到期策略:

绝对时间(Absolute)

这意味着条目在特定的时间到期。

滑动时间(Sliding)

在此的意思是在从它最后一次被访问后经过了指定时间后到期。默认的时间是 2 分钟。

扩展格式

这允许开发人员更细致的处理条目何时到期。例如,可以指定条目在每个星期六的晚上 10:03 分到期,或者在一个月的第三个星期二到期。扩展格式都列出在 ExtendedFormat.cs 文件中。

文件依赖

条目在特定文件被修改后到期。

前面三个策略,绝对时间、滑动时间和扩展格式都可认为是基于时间的到期。可以将基于时间的到期用于短暂的缓存条目,例如那些定期刷新或仅在指定时间有效的条目。基于时间的到期让你设置仅在缓存中保持最新的条目的策略。例如,如果编写了一个跟踪当前汇率的的应用程序,汇率数据从一个频率更新的 Web 站点上获取,就可以缓存当前汇率为那些汇率在源 Web 站点上保持不变的时间。在这种情况下,将设置基于 Web 站点更新频率的到期策略。

第四种策略,文件依赖,可以认为是一种基于通知的到期。它定义了缓存的条目的有效性基于一个特定的文件。如果文件被修改,缓存的条目就不再有效并从缓存中移除。

Add 方法有二个重载。NeverExpired 接受默认的到期策略,另一个重载允许自己设置到期策略。可以使用你能想到的所有策略,包括自己创建的策略。(关于用添加自己的到期策略来扩展缓存应用程序的更多详细信息,请参见添加新的到期策略。)如果有一个有多个策略的条目,条目将在最严格的策略到来时到期。

标记和清除

到期是一个两部分的过程。第一部分可以认为是标记,第二部分可以认为是清除。处理分成隔离的任务是为了避免如果应用程序使用 BackgroundScheduler 试图到期的条目可能发生的冲突。

在标记期间,BackgroundScheduler 标记哈希表的一个副本,并检查其中的每个缓存条目看它是否可以被到期。在它这样做时,它锁定了条目。如果条目可以到期,BackgroundScheduler 给在缓存中条目设置一个标记。

在清除期间,BackgroundScheduler 重新检查每个标记的 CacheItem ,看它在标记后是否被访问过。如果它被访问过话,条目将保持在缓存中。如果它没有被访问,它将被到期并从缓存中移除。在条目到期时会触发一个 Windows Management Instrumentation( WMI )事件。

回调

可选择的是,开发人员可以使用 Add 方法的一个重载来指定应用程序在条目到期并从缓存中移除后接收一个回调。如果需要,应用程序将刷新缓存。

条目也许可以在应用程序退出时依在缓存中,并且可能在应用程序重启时其中许多已到期。在这种情况下,条目保持在缓存中,并且条目的回调发生在第一个到期周期期间。然而,如果应用程序在第一个到期周期发生前请求一个到期的条目,缓存将执行回调,并返回 null 给应用程序。这确保每个到期条目回调的发生,并防止应用程序接收到一个到期的条目。

清理处理的设计

缓存应用程序块的清理处理由 BackgroundScheduler 对象执行。它在每次添加条目时检查缓存,看缓存中条目的数量是否已到了预定的限制。可以在使用配置控制台配置一个缓存管理器实例时设置这个限制,也可以设置在清理开始后要从缓存中移除多少个条目。

在条目添加到缓存时,它可以被给予这四个优先级之一:Low, Normal, High 或者 Not RemovableBackgroundScheduler 对象用基于优先级的主排序和基于条目最后访问时间的次排序来决定哪个条目将被删除。例如,才被使用过的 Low 优先级的条目将在已三年没有访问过的 High 优先级之前被清理。默认值是 Normal

NotRemoveable 优先级被用在当要条目保持在缓存中直到它到期时。然而,缓存不能仅使用为数据条目已存在的位置。缓存将用于提高性能,不使用为永久存储的形式。

不像到期处理,清理处理在单一过程中执行标记和清除。关于标记和清除的更多信息,请参见到期处理的设计。

posted @ 2007-10-29 00:59  Dorian Deng  阅读(1570)  评论(1编辑  收藏  举报