建筑";孤立的;及;“自动更新”;java中的缓存(java.util.List)

建筑";孤立的;及;“自动更新”;java中的缓存(java.util.List),java,caching,proxy,transactions,custom-lists,Java,Caching,Proxy,Transactions,Custom Lists,对于任何感兴趣的人:我已经实现了我正在寻找的行为的代码,并在谷歌代码上公开了它。到这里来 -- 大家好 我正在尝试编写一个框架,其中包含许多从长期缓存创建的短期缓存。这些短期缓存需要能够返回其全部内容,这些内容是从原始长期缓存中克隆出来的 实际上,我试图为短期缓存构建一个事务隔离级别。用户应该能够修改短期缓存的内容,但对长期缓存的更改不应该被传播(也有一种情况,根据缓存类型,更改应该被传播) 我会尽力解释: 主缓存包含:[A、B、C、D、E、F] 使用状态[A、B、C、D、E、F]创建的临时缓存

对于任何感兴趣的人:我已经实现了我正在寻找的行为的代码,并在谷歌代码上公开了它。到这里来

--

大家好

我正在尝试编写一个框架,其中包含许多从长期缓存创建的短期缓存。这些短期缓存需要能够返回其全部内容,这些内容是从原始长期缓存中克隆出来的

实际上,我试图为短期缓存构建一个事务隔离级别。用户应该能够修改短期缓存的内容,但对长期缓存的更改不应该被传播(也有一种情况,根据缓存类型,更改应该被传播)

我会尽力解释:

主缓存包含:[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上的标准集合构造函数创建一个新的列表实例,但是当您得到大约200000个项目时,系统的内存就会耗尽。我知道200000的值对于迭代来说太多了,但是我试着稍微强调一下我的代码

我曾认为它可能会以某种方式“代理”列表,因此临时缓存使用主缓存,并存储其所有更改(实际上是更改的纪念品),但是,当您想要迭代临时缓存或检索特定索引处的项时,这很快就会成为一场噩梦。还考虑到我希望对列表内容进行一些修改(取决于临时缓存的类型,无论它是否为“自动更新”),我完全无法理解

任何指向技术或数据结构或只是尝试和研究的一般概念的指针都将受到极大的赞赏

干杯


Aidos

以下是您想要做的事情。类似于MVCC的东西,多版本货币控制

简单地说,您需要将事务ID与缓存元素相关联

因此,缓存条目将如下所示:

public class CacheEntry {
    long transactionId;
    boolean deleted;
    Object value;
}
{tid: 14 deleted: false value: 789}
{tid: 12 deleted: true  value: nul}
{tid: 10 deleted: false value: 456}
{tid:  5 deleted: false value: 123}
缓存项以与transactionid相反的顺序存储在列表中

当您获取一个缓存元素时,您将查找列表(在哈希映射中)。然后搜索具有小于或等于事务的事务ID的最高事务ID的值

所以,让我们考虑一下删除问题

您有交易记录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,并且最高事务限制可以缓存的类型?最好是,以某种方式确保,您只获得不可变的缓存项,这将使一切变得更容易。谢谢您的回答!我对自己以前没有看到这一点感到非常震惊。我想知道是否有什么“类似”的subversion可以用于java(直到您指出,我才意识到类似之处)。