2010-04-10 56 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