2014-02-28 58 views
2

我想在Java中實現緩存,該緩存應該緩存給定ID的標記。 (一個ID的0-N標籤) 在1億個實體中有大約1000個唯一標籤,但實際數量可能會有幾千個。 它不需要考慮ID /標記驅逐。
如果存在比我們可以在內存中緩存更多標籤的緩存,則預計會拋出OutOfMemoryError。
但是,設計應該確保儘可能少的內存來緩存標籤。在Java中實現高速緩存以讀取性能,完全沒有驅逐

緩存有一個方法 'getTags()'方法接受一個id並返回實體的標籤。

這種方法在最壞的情況下(禁止垃圾回收)需要幾個012納秒的時間。它可以在幾毫秒內被稱爲1000年的時間。 緩存應該設計用於多線程訪問,在幾ms內請求獲取標籤的數量爲1000的 。

請建議一個好的數據結構/集合使用,可以爲我提供這樣的性能。

+0

看看[Guava caches](http://code.google.com/p/guava-libraries/wiki/CachesExplained) – vanOekel

+0

請描述緩存是如何填充和/或更新的。 – leventov

+0

@vanOekel番石榴高速緩存具有驅逐戰略,但性能差和內存佔用。 OP正在要求相反。 – leventov

回答

2

要選擇一個好的緩存,並具有良好的內存讀取性能,請查看cache2k benchmark page的基準測試。它比較了EHCache,番石榴緩存,cache2k和Infinispan。

如果你不需要驅逐,爲什麼你需要緩存呢?無論如何,cache2k內就可以切換到驅逐的實現具有非常低的開銷,這樣的:

Cache<String, String> c = 
    CacheBuilder.newCache(String.class, String.class) 
    .source(new CacheSource<String, String>() { 
     @Override 
     public String get(String o) { 
     ... fill code ... 
     } 
    }) 
    .implementation(ClockCache.class) 
    .build(); 

另一種低開銷的驅逐是org.cache2k.impl.RandomCache,這只是一個圓形選擇驅逐候選對象羅賓指針,穿過哈希表。不同的算法不在API模塊中公開,因此您需要在編譯範圍內有cache2k-core.jar

聲明:我對cache2k工作...

0

我已經在我的一個項目中使用的ConcurrentHashMap和行之有效的。我還沒有測量到納秒級的性能,但適合我的應用。

相關問題