単純なJavaインメモリキャッシュを探す[終了]


102

同時実行性が高く(LinkedHashMapでは不十分)、定期的にディスクにシリアル化できる単純なJavaインメモリキャッシュを探しています。

必要な機能の1つは見つけるのが難しいことがわかっていますが、これはオブジェクトを「覗く」方法です。これは、キャッシュが他の方法よりも長くオブジェクトを保持することなく、キャッシュからオブジェクトを取得することを意味します。

更新:言及しなかった追加の要件は、キャッシュされたオブジェクト(フロート配列を含む)をインプレースで変更できる必要があることです。

誰かが何か推奨事項を提供できますか?


1
「プロセス内」でより軽量な類似のものを探しています。それを使用して、ヒープ内のEclipseプラグイン内にいくつかのデータを格納したいと思います。EhcacheとJCSは、私の好みには重すぎ/分散/ J2EEのようです。
ウリ


私はApache Ignite(ignite.apache.org)をお勧めします
Bhagat S.

1
この質問は閉じられ(事実の6年後)、今日でも疑問に思っていることは、SOのモデレーターシステムがどのように機能していないかを示しています。
ダスティンバン

回答:


61

この質問はもともと尋ねられたため、GoogleのGuavaライブラリには強力で柔軟なキャッシュが含まれています。これを使用することをお勧めします。


3
してください春はもうグアバキャッシュをサポートしていないことに注意してください:stackoverflow.com/questions/44175085/...
罪人

@sanityはJcacheを実装していますか?
gaurav

Caffineは、高性能で優れたキャッシングライブラリでもあります。カフェインは、Java 8に基づく、最適に近い高性能のキャッシュライブラリです。カフェインは、Google GuavaにインスパイアされたAPIを使用してメモリ内キャッシュを提供します
スレーブ

37

Ehcacheはこのための非常に優れたソリューションであり、アイドルタイムスタンプを更新しないように調べる方法があります(getQuiet()がメソッドです)。内部的には、EhcacheはConcurrentHashMapのような一種のマップのセットで実装されているため、同様の並行処理の利点があります。


2
おかげで、追加の質問:EHcache(たとえば、配列)からオブジェクトを取得して変更した場合、オブジェクトはキャッシュで更新されますか?すなわち。EHCacheはオブジェクトへの参照を維持していますか?
正気度

1
私はそう信じていますが、これを安全に行うには、もちろんオブジェクトを適切にロックする必要があります。
Alex Miller、

私はehcacheが大好きですが、それは10mbのjarファイルです。大きすぎる。
markthegrea

23

シンプルなものが必要な場合、これで十分でしょうか?

Map<K, V> myCache = Collections.synchronizedMap(new WeakHashMap<K, V>());

ディスクには保存されませんが、シンプルにしたいと言っていました...

リンク:

(Adamがコメントしたように、マップの同期はパフォーマンスに影響を与えます。アイデアに毛髪がないとは言いませんが、迅速で汚いソリューションとしては十分です。)


4
巨大なマップ全体を同期することは、かなりのペナルティです。ウィークタイプをコンカレントハッシュマップに簡単に格納し、定期的に削除することができます。
Adam Gent

7
ConcurrentHashMapのはCollections.synchronizedMapよりも優れているstackoverflow.com/questions/6692008/...
パブロ・モレッティ

8
パフォーマンスの面では、ConcurrentHashMapの方が絶対的に優れていますが、ガベージコレクターがメモリを再利用できるようにするという点で、WeakHashMapのプロパティは共有されません。これは、あなたにとって重要な場合とそうでない場合があります。
エヴァン

4
次にを使用しますConcurrentHashMap<WeakReference<T>>docs.oracle.com/javase/7/docs/api/java/lang/ref/...
jdmichal

19

インメモリJavaキャッシュのもう1つのオプションはcache2kです。インメモリパフォーマンスは、EHCacheおよびgoogle guavaよりも優れています。cache2kベンチマークページをご覧ください

使用パターンは他のキャッシュと似ています。次に例を示します。

Cache<String,String> cache = new Cache2kBuilder<String, String>() {}
  .expireAfterWrite(5, TimeUnit.MINUTES)    // expire/refresh after 5 minutes
  .resilienceDuration(30, TimeUnit.SECONDS) // cope with at most 30 seconds
                                          // outage before propagating 
                                          // exceptions
  .refreshAhead(true)                       // keep fresh when expiring
  .loader(new CacheLoader<String, String>() {
    @Override
    public String load(final String key) throws Exception {
      return ....;
    }
  })
  .build();
String val = cache.peek("something");
cache.put("something", "hello");
val = cache.get("something");

あなたがグアバのキャッシュを依存関係として持っているなら、グアバのキャッシュを試すことは良い選択肢かもしれません。


cruftex、アプリケーションを閉じると、キャッシュは登録されたすべてのデータを破棄するか、または破棄しませんか?
Menai Ala Eddine-アラジン

10

imcacheは簡単に使用できます。以下はサンプルコードです。

void example(){
    Cache<Integer,Integer> cache = CacheBuilder.heapCache().
    cacheLoader(new CacheLoader<Integer, Integer>() {
        public Integer load(Integer key) {
            return null;
        }
    }).capacity(10000).build(); 
}

9

これを試して:

import java.util.*;

public class SimpleCacheManager {

    private static SimpleCacheManager instance;
    private static Object monitor = new Object();
    private Map<String, Object> cache = Collections.synchronizedMap(new HashMap<String, Object>());

    private SimpleCacheManager() {
    }

    public void put(String cacheKey, Object value) {
        cache.put(cacheKey, value);
    }

    public Object get(String cacheKey) {
        return cache.get(cacheKey);
    }

    public void clear(String cacheKey) {
        cache.put(cacheKey, null);
    }

    public void clear() {
        cache.clear();
    }

    public static SimpleCacheManager getInstance() {
        if (instance == null) {
            synchronized (monitor) {
                if (instance == null) {
                    instance = new SimpleCacheManager();
                }
            }
        }
        return instance;
    }

}

同期されたマップに依存することに関する問題は、他の回答ですでに説明されています。
サニティ2013年

@sergeyB:キャッシュを実装するための簡単な同様のソリューションを探していました...ありがとう
Prakruti Pathik

1
public static SimpleCacheManager getInstance() {する必要がありpublic synchronized static SimpleCacheManager getInstance() {そうでない場合はif (instance == null) {スレッドセーフではありません。:あなたは同期がすべてのgetInstance()呼び出しのために行われているので、参照して一斉に監視対象を削除することができ、その場合にはjavaworld.com/article/2073352/core-java/...
缶Kavaklıoğlu

シングルトンに列挙型を使用することをお勧めできますか?dzone.com/articles/java-singletons-using-enum
Erk



0

Ehcacheをお試しください?独自のキャッシング有効期限アルゴリズムをプラグインできるため、ピーク機能を制御できます。

ディスク、データベース、クラスター全体などにシリアル化できます...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.