JavaインメモリオブジェクトキャッシングAPI。探しているものはありますか。
今、私はただ地図を使用しています:
Map cache = new HashMap<String, Object>();
cache.put("key", value);
キャッシュを拡張して、次のような基本機能を含める必要があります。
ただし、次のような高度な機能は必要ありません。
インメモリキャッシング:
エンタープライズキャッシング:
EHCache はとてもいいです。メモリ内キャッシュを作成できます。メモリキャッシュを作成する例については、 コードサンプル をご覧ください。最大サイズと有効期間を指定できます。
EHCacheはいくつかの高度な機能を提供しますが、それらの使用に興味がない場合は提供しないでください。ただし、要件が変更された場合にそれらが存在することを知ってうれしいです。
これはメモリ内キャッシュです。コードで作成され、構成ファイルはありません。
CacheManager cacheManager = CacheManager.getInstance();
int oneDay = 24 * 60 * 60;
Cache memoryOnlyCache = new Cache("name", 200, false, false, oneDay, oneDay);
cacheManager.addCache(memoryOnlyCache);
200個の要素を保持し、ttlが24時間のキャッシュを作成します。
MapMaker
がとても気に入っています Google Guava (- [〜#〜] api [〜#〜] )
JavaDocには、その使いやすさとパワーの両方を示す非常にきちんとした例があります。
ConcurrentMap<Key, Graph> graphs = new MapMaker()
.concurrencyLevel(32)
.softKeys()
.weakValues()
.expiration(30, TimeUnit.MINUTES)
.makeComputingMap(
new Function<Key, Graph>() {
public Graph apply(Key key) {
return createExpensiveGraph(key);
}
});
さらに、Guavaのリリース10.0では、はるかに広範な com.google.common.cache
パッケージ 。
グアバの MapMaker は、 CacheBuilder クラスに置き換えられました。
KittyCacheと呼ばれる私の小さなキャッシュライブラリをチェックアウトすることもできます。
https://github.com/treeder/kitty-cache
いくつかのパフォーマンスベンチマークとehcacheがあります。
SimpleJPA プロジェクトで2次キャッシュとして使用されます。
LinkedHashMapをチェックアウトして、サードパーティのjarなしで単純なキャッシュを実装できます。
Map <String, Foo> cache = new LinkedHashMap<String, Foo>(MAX_ENTRIES + 1, .75F, true) {
public boolean removeEldestEntry(Map.Entry<String, Foo> eldest) {
return size() > MAX_ENTRIES;
}
};
その後、次のようにキャッシュから取得できます
Foo foo = cache.get(key);
if (foo == null && !cache.containsKey(key)) {
try {
FooDAO fooDAO = DAOFactory.getFooDAO(conn);
foo = fooDAO.getFooByKey(key);
cache.put(key, foo);
} catch (SQLException sqle) {
logger.error("[getFoo] SQL Exception when accessing Foo", sqle);
}
}
読者のための練習として残ります:)
[〜#〜] jcs [〜#〜] が試行され、真です。キャッシングメカニズムに関する限り、軽量ですが、実際のコードを掘り下げて、HashMapで何をするのかを、必要なものだけにまねることができます。あなたはあなたが探しているものについてかなり良い考えを持っているようです。
memcachedにはJava用のクライアントがあります。 http://www.danga.com/memcached/ キャッシングサーバーとして別のプロセスが必要ですが、強力なものです。