2010-04-10 26 views
1

对于任何有兴趣的人:我已经实现了我正在寻找的行为的代码并在google-code上开源。在这里得到它! pojo-mvcc在Java中构建“孤立”和“自动更新”缓存(java.util.List)

-

嗨,大家好,

我想写其中含有大量从长寿的缓存中创建短命高速缓存的框架。这些短暂的缓存需要能够返回它们的entier内容,这是来自原始长生命的缓存的克隆。

实际上,我正在尝试构建的是短暂高速缓存的事务隔离级别。用户应该能够修改短暂高速缓存的内容,但不应该改变长生命期高速缓存(还有一种情况是应根据缓存类型推送更改)。

我会尽我所能,试图解释:

主缓存包含:[A,B,C,d,E,F]与国家创建 临时缓存[A,B,C, D,E,F]

1)临时缓存添加项目G:[A,B,C,D,E,F] 2)临时缓存删除项目B:[A,C,D,E ,F]

主缓存包含:[A,B,C,d,E,F]

3)主高速缓冲存储器添加项[X,Y,Z]:[A,B,C ,D,E,F,X,Y,Z]

临时缓存包含:A,C,d,E,F]

事情变得更难当项值可能发生变化,不应该总是被更新(所以我甚至不能共享底层对象实例,我需要使用克隆)。

我已经实现了使用ArrayList上的标准Collection构造函数创建List的新实例的简单方法,但是当您获得大约200,000个项目时,系统只会耗尽内存。我知道200,000的值是迭代过度的,但我试图强调我的代码。

我以为它可能能够以某种方式“代理”列表,所以临时缓存使用主缓存,并存储它的所有变化(实际上是变化的记忆),然而这很快变成当您想要迭代临时缓存或者检索特定索引处的项目时是一场噩梦。此外,我希望对列表内容进行一些修改(取决于临时缓存的类型,不管它是否为“自动更新”),并且我彻底摆脱了我的深度。

任何指向技术或数据结构的指针或只是一般概念来尝试和研究将不胜感激。

干杯,

Aidos

+0

您是否限制可以缓存的类型?最好的是,以某种方式确保,你只能得到不可变的缓存条目,这将使一切变得更容易。 – Dominik 2010-04-10 16:33:10

回答

2

这里是你想要做什么。类似于所谓的MVCC,多版本货币控制。

简而言之,您需要将事务ID关联到您的缓存元素。

所以缓存条目会是这个样子:

public class CacheEntry { 
    long transactionId; 
    boolean deleted; 
    Object value; 
} 

缓存条目存储在一个列表中,以相反的顺序的transactionID。

当你去找一个缓存元素时,你可以查看列表(在你的哈希映射中)。然后搜索具有最高交易ID的值,该值小于或等于您交易的交易ID。

因此,让我们来考虑DELETE问题。

您有交易10,正在寻找“ABC”。我们假设ABC已经在缓存中,并且它被交易5放入。

因此,T10获取ABC的条目列表,搜索列表并发现在T5处存在值“123 ”。 T5是小于或等于T10的最高交易。 T10将ABC的值从123更改为456.

现在T12出现并寻找ABC。它会从T10中找到456的值。 T12决定删除ABC,因此T12的“已删除”缓存条目被放置在缓存条目列表中。如果T10再次尝试查找ABC,它将找到456,因为12> 10,而最高交易< = 10是T10,所以它看不到删除。如果T12看起来它仍然会被删除,如果T10是,它仍然是,它仍然是,它仍然是456.

所以,到最后,你缓存列表如下:

{tid: 14 deleted: false value: 789} 
{tid: 12 deleted: true value: nul} 
{tid: 10 deleted: false value: 456} 
{tid: 5 deleted: false value: 123} 

你有下一个问题是处理跨开放交易的知名度。即另一个事务可以看到来自另一个未提交的未决事务的数据。但这并不难,因为它只是在扫描合适人选的版本列表时调整标准。并且您可以保留一个事务ID列表及其状态(打开,提交,回滚)。

最后,你必须想出一个机制来清理松散的末端。在您提交两笔交易后,如果没有其他未结交易,则可以删除较旧的记录。例如,如果您有来自T5和T10的数据,如果它们都提交,则由于T10现在处于“当前”状态,因此没有人能够再次“查看”T5的数据。所以,T5行可以被删除。

这可能是最好的,只需迭代缓存并删除过时的事务条目即可。

这就是它的要义,显然魔鬼在细节中。

+0

谢谢你的回答!我对自己感到非常震惊,以前我没有看到过。 我不知道是否有什么“像”颠覆我可以用于Java(我没有意识到相似性,直到你指出)。 – Aidos 2010-04-11 03:01:40