2011-06-07 46 views
4

我有一个内存中缓存它通过聚集一定程度存储一组信息 - 在学生下面的例子让我们说我把它存储由年,主题,老师:降低数据的粒度集

# Students Year Subject Teacher 
1 30   7  Math  Mrs Smith 
2 28   7  Math  Mr Cork 
3 20   8  Math  Mrs Smith 
4 20   8  English Mr White 
5 18   8  English Mr Book 
6 10   12  Math  Mrs Jones 

不幸的是,我的缓存没有GROUP BY或类似的功能 - 所以当我想要在更高级别的聚合中查看事物时,我将不得不自己“滚动”数据。例如,如果我按年汇总的学生,受上述数据看起来像这样:

# Students Year Subject 
1 58   7  Math 
2 20   8  Math 
3 38   8  English 
4 10   12  Math 

我的问题是这样 - 我最好怎么会在Java中做到这一点?从理论上讲,我可以从这个缓存中取回数以万计的对象,因此能够快速“收集”这些集合可能变得非常重要。

我最初的(也许是天真的)想法是按照以下方式做一些事情;

直到我用尽的记录列表:

  • 每一个“独一无二”的记录,我来 跨越添加为关键, HashMap中。
  • 如果我遇到一个记录是 有聚集的这个新的水平 相同的数据,其添加量 现有的一个。

现在我知道这是一个相当普遍的问题,有很多更好的方法来做到这一点。所以我很欢迎任何关于我是否指向正确的方向的反馈。

“获取新的缓存”我怕:)

戴夫不是一个选项。

+0

我认为这是数据库发明的主要原因......所以关于这个主题有大量的文献。我认为你需要一个索引(或hashmap),用于你想在缓存上执行的每个'查询'。 – sje397 2011-06-07 15:40:01

回答

0

你的“最初的想法”并不是一个坏的方法。要改进它的唯一方法是为要汇总的字段(年份和主题)提供索引。 (这基本上是dbms在定义索引时所做的工作。)然后,您的算法可以重新迭代遍历所有索引值;您不必检查每条记录的结果散列。

当然,当填充缓存并在修改数据时维护它时,您将不得不构建索引。