2012-11-13 105 views
0

重寫方法我書面方式實現的LRU緩存與LinkedHashMap一類。通常我需要覆蓋的方法putget以寫入到磁盤當一個對象被添加到緩存中,並從磁盤獲取該對象未在高速緩存中找到。的緩存實現

我LRUCache類的樣子:

public class LRUCache<K, V> extends LinkedHashMap<K, V> 
    implements Serializable { 
    /** 
    * File where the elements of the cache are stored 
    */ 
    private File cacheFile = null; 

    /** 
    * UID of the class for serialization. 
    */ 
    private static final long serialVersionUID = 1L; 
    /** 
    * Maximum number of entries in the cache. 
    */ 
    private final int maxEntries; 

    /** 
    * Default constructor of the cache. 
    * 
    * @param newMaxEntries 
    *  the maximum number of entries in the cache. 
    */ 
    public LRUCache(final int newMaxEntries, String fileName) { 
     super(newMaxEntries + 1, 1.0f, true); 
     this.maxEntries = newMaxEntries; 
     this.cacheFile = new File(fileName); 
    } 


    @Override 
    public V get(Object key) { 
     V VObject = super.get(key); 
     if (VObject == null) { 
      // TODO: Fetch from disk 

     } 
     return VObject; 
    } 

    @Override 
    public V put(K key, V value) { 
     // TODO: Write to disk 

     return super.put(key, value); 
    } 

    @Override 
    protected final boolean 
      removeEldestEntry(final Map.Entry<K, V> eldest) { 
     return super.size() > maxEntries; 
    } 

}

我的問題是我怎麼可以重寫這兩種方法來做到這一點的最快越好。高速緩存的對象是否實現了Externalize是一個好主意?

感謝

+1

除非必須,否則請不要重新發明輪子。使用Guava緩存支持。它重量輕,螺紋安全。 –

+0

番石榴不會存儲比適合內存更多的數據。番石榴緩存是本地應用程序的一次運行,因此它們不會將數據存儲在文件中。 – synack

+0

神聖的廢話我沒有看到'文件'。 **廢話不要這樣做!**你應該看看Ehcache(或者memcache或redis或者已經做過的無數事情)。嚴重不要編寫你自己的分佈式緩存。這不是一個簡單的問題,需要考慮大量的併發問題。 –

回答

1

抱歉地說,但實際上,你要在這裏解決各種問題:

  • 什麼是最好的/最快的Java對象序列化?已經在其他問題中討論過。
  • 如何更新之前寫入的對象到文件?
  • 你如何有效地找到字節的文件中存儲的對象的偏移,需要檢索的時候?
  • 如何從文件中刪除項目並壓縮文件?
  • 如何快速寫入並避免隨機存取硬盤存儲?

所有的答案,你在書本上找到數據庫的最後一個問題。

如果你只是有一個不經常更改視圖對象和你是爲一個簡單的解決方案,只需序列化的HashMap到每把文件。如果數據很關鍵,那麼總是寫一個新文件並刪除舊文件是一件好事,以防數據丟失。

BTW:在您的示例代碼移除磁盤存儲對象的缺失。