Java周期值缓存架构

时间:2013-04-17 09:58:21

标签: java algorithm caching architecture

任务是为周期性值实现缓存。更具体地说 - 这些是与银行账户相关的一些记录。每条记录都有一个日期和一天内的某个位置。因此,每个记录可以通过这些属性进行比较。缓存必须包含与查询期间相关的记录列表。当执行更大周期的查询时,也可以合并缓存的值。

让我们考虑几个例子。某个特定帐户的历史记录有10条记录(日期格式为MM / dd / yyyy:

01/01/2012 
02/01/2012 
03/01/2012 
04/01/2012 
05/01/2012 
06/01/2012 
07/01/2012 
08/01/2012 
09/01/2012 
10/01/2012

示例1

第一次查询是针对02/15/2012期间 - 2012年3月15日。

查询结果将是一条记录:

03/01/2012

缓存应包含记录:密钥“02/15/2012 - 03/15/2012”,值[“03/01/2012”]

该期间或子期间(即02/16 / 2012-03 / 15/2012)的所有查询都应从缓存中返回“03/01/2012”。

执行的第二次查询是针对01/15/2012 - 02/16/2012期间的。

查询结果将是两条记录:

02/01/2012
03/01/2012

有以下几点要提及:

1)对基础数据存储的查询应仅在01/15/2012 - 02/14/2012期间执行。这是因为缓存已包含02/15/2012的所有条目。

2)单个缓存条目的边界将随其存储的记录数一起更新。

结果缓存然后应包含单个记录:键“01/15/2012 - 03/15/2012”,值[“02/01/2012”,“03/01/2012”]。

然后,对子句点的任何查询都应按键查找缓存条目,然后从缓存中选择所需的记录。

示例2

当前缓存状态为:

Entry 1: "01/15/2012 - 03/15/2012" => ["02/01/2012", "03/01/2012"]
Entry 2: "04/15/2012 - 05/15/2012" => ["05/01/2012"]
Entry 3: "07/02/2012 - 09/02/2012" => ["08/01/2012", "09/01/2012"]

查询将在01/01/2012 - 10/01/2012期间执行。结果包含所有记录历史记录:

01/01/2012 
02/01/2012 
03/01/2012 
04/01/2012 
05/01/2012 
06/01/2012 
07/01/2012 
08/01/2012 
09/01/2012 
10/01/2012

缓存应包含单个条目:key“01/01/2012”,value [“01/01/2012”,“02/01/2012”,“03/01/2012”,“04/01 / 2012“,”05/01/2012“,”06/01/2012“,”07/01/2012“,”08/01/2012“,”09/01/2012“,”10/01/2012“ ]


我正在挑战这个任务一个星期,找不到任何美观的简单算法来处理这样的缓存。

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:0)

我认为Interval Tree可能符合您的需求 - here is a Java implementation。区间树存储间隔,可以按间隔查询(例如,您可以存储[1,5],[2,7],[6,10],在[3,5]上查询它,它返回[1,5] ],[2,7]即与查询重叠的所有区间)。您存储点而不是间隔,但只需将点存储为足够小的非重叠间隔,您就可以了。

因为这是一个缓存,您可能希望将密钥和值存储在SoftReferences中 - 如果您遇到OutOfMemoryError,这将允许垃圾收集器释放它们。 / p>