2011-03-03 51 views
3

什麼是內存緩存?我從網上找不到關於它的很多信息。實際上,我被要求用C++設計一個基於OO概念的內存緩存,但是不知道如何開始。任何建議,將不勝感激。使用面向概念的內存緩存設計

+0

沒有更多的細節,這是不可能的一天。他們可能會談論memoising,或者可能是磁盤緩存,或... – 2011-03-03 18:04:27

回答

5

這取決於上下文,但通常情況下,內存中緩存會存儲一些值,以便稍後可以檢索它,而不是創建新對象。這通常與數據庫結合使用 - 或者實際上任何構建/檢索對象的應用程序都是昂貴的

對於一個簡單的內存緩存,想象下面的僞類(違反噸的最佳實踐,所以不要將它複製!):

class Integer { 
    int value; 

public: 

    Integer(int value) : value(value) { 
     sleep(1000); // Simulates an expensive constructor 
    } 
}; 

現在,假設你需要創建該類的實例:

Integer one(1); 
Integer two(2); 
// etc. 

...但後來(在另一種方法)也許你需要創建一個新實例2

Integer two(2); 

這很貴。如果你可以回收舊的價值呢?使用構造函數,這是不可能的,但我們可以很容易地做到這一點使用工廠方法:

class Integer { 
    int value; 

    static std::map<int, Integer> cache; 

    Integer(int value) : value(value) { 
     sleep(1000); // Simulates an expensive constructor 
    } 

    friend Integer make_int(int); 
}; 

Integer make_int(int value) { 
    std::map<int, Integer>::iterator i = Integer::cache.find(value); 
    if (i != Integer::cache.end()) 
     return i->second; 

    Integer ret = Integer(value); 
    Integer::cache[value] = ret; 
    return ret; 
} 

現在我們可以使用make_int創建或檢索一個整數。每個值將只創建一次:

Integer one = make_int(1); 
Integer two = make_int(2); 
Integer other = make_int(2); // Recycles instance from above. 
+0

返回i->秒; 這是什麼意思? – 2014-03-20 12:41:07

+1

我明白了。謝謝 – 2014-03-20 12:46:24

0

一個內存中緩存用於存儲通常被存儲在外部,就像一個數據庫記錄,一個HTTP請求,或一個文件的內容的東西。通常,您將維護一個LRU的對象列表。這很容易管理,因爲您只需要在獲取請求時將對象移到列表的頭部,並在需要添加新對象時刪除列表中的最後一個對象。顯然,你可以增加很多複雜度來調整這種行爲,但這是基本的算法。

您可能需要一個「通讀」緩存。也就是說,程序總是要求緩存尋找它需要的對象,如果它不存在於緩存中,則取決於緩存來獲取它。這樣,它簡化了編程,因爲應用程序不必去兩個不同的地方來獲取對象。如果您可以修改已經負責讀取對象的現有模塊(例如,DAO),它也可以隱藏添加緩存。

0

memcachedC++ API,並可能是值得看一下它是否符合你的需求:

免費&開源的,高性能的,分佈式的內存對象緩存系統,在本質上是通用的,但用於用於通過減輕數據庫負載來加速動態Web應用程序。

Memcached是從數據庫調用,API調用,或頁面 渲染的結果 在內存中的鍵值 商店任意 數據(字符串,對象)的小塊。