1.缘起:
在增量自动获取器章节的缘起部分,我们曾提到增量缓存,本节我们将深入探讨它以及用于管理增量缓存的管理器。我们还是以增量自动获取器章节提到的例子作为基础,并做更进一步的讨论。
OK,现在让我们开始这有趣的旅程。
首先,基于前面例子给出的上下文,我们知道IIncreaseAutoRetriever获取的增量是用于累积当天的已成交订单报表的。“当天已成交报表”就是一个典型的增量缓存,每当有新的增量到来,都会累加到上面。
我们假设今天是2009.07.08,那么我们可以将当前的增量缓存的ID标记为20090708,每隔一分钟都会有新的增量累加到该增量缓存实例中去。直到时钟指向2009.07.09的00:00:00时,表示当前这一天已经结束,此时,将创建一个新的ID为20090709的增量缓存实例来容纳新的增量。而ID为20090708的增量缓存实例将不会再有新的增量进来,所以,其内容也将不再发生变化。此时,我们可以将ID为20090708的增量缓存实例序列化后进行存储。这样做的好处是,当以后任何时候我们需要查询2009.07.08这一天的报表时,可以直接从存储设备加载20090708的增量缓存到内存中并反序列化,然后返回结果,这样就不用再去重新统计这一天的所有已成交的订单了。
所以,当时间进入2009.07.09,那么ID为20090708的增量缓存实例就变成了一个历史缓存,而标记为20090709的新缓存会处理新来的增量。如此,我们可以使用一个管理器将所有的历史缓存和当前正在运行的缓存管理起来。我设计的ESBasic.ObjectManagement.Increasing.Management.RoundCacheManager就是为的这个目的。
Round缓存管理器的形象示意图如下:
2.适用场合:
RoundCacheManager是依赖于IIncreaseAutoRetriever的,所以如果要使用RoundCacheManager,首先必须满足IIncreaseAutoRetriever所需的条件,另外还有RoundCacheManager需要的额外增强的条件。
(1)需要定时从数据源获取新的增量数据。
(2)数据源可能不只一个。
(3)需要支持“轮”(Round)的概念。在Round切换时,需要能够准确识别增量断点。
(4)增量数据有某个字段是递增的。
(5)需要将获取的增量数据放入到正确的增量缓存。
(6)在Round发生切换时,需要产生新的增量缓存来接收新的增量。而历史的增量缓存也需要被管理起来。
(7)被管理的历史缓存在其过期的时候,会自动从管理器中移除。
3.设计思想与实现
在分析RoundCacheManager的源码之前,我们先将其会涉及到的一些重要概念说明一下。
由于增量缓存是基于Round的,比如上面提到的一天为一个Round,所以,在ESBasic中称这样的缓存为Round Cache,如果是当前正在使用的增量缓存,则称为Round Increasing Cache。
当Round的切换点到来时,当前的Round Increasing Cache就会演变成一个属于历史的Round Cache。
首先,ESBasic要求Round Cache必须实现IRoundCache泛型接口,IRoundCache接口定义如下: