JCacheの紹介
1概要
簡単に言えば、http://www.javadoc.io/doc/javax.cache/cache-api/1.0.0[JCache]はJavaの標準キャッシングAPIです。このチュートリアルでは、JCacheとは何か、またその使い方について説明します。
2 Mavenの依存関係
JCacheを使用するには、
pom.xml
に次の依存関係を追加する必要があります。
<dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
<version>1.0.0-PFD</version>
</dependency>
このライブラリの最新版はhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22cache-api%22[Maven Central Repository]にあります。
また、私たちの
pom.xml
にAPIの実装を追加する必要があります。ここではHazelcastを使います。
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast</artifactId>
<version>3.9-EA</version>
</dependency>
Hazelcastの最新版はhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22hazelcast%22[Maven Central Repository]にもあります。
3 JCacheの実装
JCacheはさまざまなキャッシュソリューションによって実装されています。
-
JCacheリファレンス実装
-
ヘーゼルキャスト
-
Oracle Coherence
-
Terracotta Ehcache
-
Infinispan
他のリファレンス実装とは異なり、** 同時実行の問題が発生するため、本番環境でJCacheリファレンス実装を使用することはお勧めできません。
4メインコンポーネント
4.1.
キャッシュ
Cache
インターフェースには、以下の便利なメソッドがあります。
-
get()
– 要素のキーをパラメータとして受け取り、
要素の値キーが存在しない場合は
null
を返します。
キャッシュ
**
getAll()
– このメソッドには____Setとして複数のキーを渡すことができます。
t
_heメソッドは、指定されたキーと関連付けられた値を
Map
として返します。
**
getAndRemove()_
– メソッドはそのキーを使用して値を取得し、
Cache
から要素を削除します
**
put()
–
Cache
に新しい項目を挿入します
-
clear()
–
Cache
内のすべての要素を削除します -
containsKey()
–
Cache
に特定のキーが含まれているかどうかを調べる
ご覧のとおり、メソッドの名前は一目瞭然です。これらの方法やその他の方法の詳細については、http://www.javadoc.io/doc/javax.cache/cache-api/1.0.0[Javadoc]を参照してください。
4.2.
CacheManager
CacheManager
は、APIの最も重要なインタフェースの1つです。これにより、
キャッシュ
を確立、設定、および閉じることができます。
4.3.
CachingProvider
CachingProvider
は、
CacheManagers
のライフサイクルを作成および管理するためのインターフェースです。
4.4.
設定
Configuration
は、
Caches
を設定するためのインタフェースです。
具体的な実装は
MutableConfiguration
とサブインターフェース
CompleteConfiguration
です。
5
Cache
を作成する
簡単な
Cache
を作成する方法を見てみましょう。
CachingProvider cachingProvider = Caching.getCachingProvider();
CacheManager cacheManager = cachingProvider.getCacheManager();
MutableConfiguration<String, String> config
= new MutableConfiguration<>();
Cache<String, String> cache = cacheManager
.createCache("simpleCache", config);
cache.put("key1", "value1");
cache.put("key2", "value2");
cacheManager.close();
私たちがしているのは、
-
CachingProvider
オブジェクトを作成します。これを作成するために使用しています。
CacheManager
オブジェクト
** 実装である
MutableConfiguration
オブジェクトを作成する
Configuration
インターフェースの概要
** 作成した
CacheManager
オブジェクトを使用して
Cache
オブジェクトを作成する
早く
** すべてのエントリを入れて、
Cache
オブジェクトにキャッシュする必要があります。
-
によって使用されたリソースを解放するために
CacheManager
を閉じる
キャッシュ
-
pom.xml
でJCacheの実装を提供していない場合は、次の例外が発生します。
javax.cache.CacheException: No CachingProviders have been configured
これは、JVMが
getCacheManager()
メソッドの具体的な実装を見つけることができなかったためです。
6.
EntryProcessor
EntryProcessor
を使用すると、
Cache
に再度追加しなくても、アトミック操作を使用して
Cache
エントリを変更できます。それを使用するには、
EntryProcessor
インターフェースを実装する必要があります。
public class SimpleEntryProcessor
implements EntryProcessor<String, String, String>, Serializable {
public String process(MutableEntry<String, String> entry, Object... args)
throws EntryProcessorException {
if (entry.exists()) {
String current = entry.getValue();
entry.setValue(current + " - modified");
return current;
}
return null;
}
}
それでは、
EntryProcessor
実装を使用しましょう。
@Test
public void whenModifyValue__thenCorrect() {
this.cache.invoke("key", new SimpleEntryProcessor());
assertEquals("value - modified", cache.get("key"));
}
7. イベントリスナー
-
Event Listenersは
EventType
enumで定義されたイベントタイプのどれかをトリガーしたときにアクションを起こすことを可能にします。 -
作成した
-
更新しました
-
削除済み
-
EXPIRED
まず、使用する予定のイベントのインターフェイスを実装する必要があります。
たとえば、
CREATED
および
UPDATED
イベントタイプを使用する場合は、インターフェイス
CacheEntryCreatedListener
および
CacheEntryUpdatedListener
を実装する必要があります。
例を見てみましょう。
public class SimpleCacheEntryListener implements
CacheEntryCreatedListener<String, String>,
CacheEntryUpdatedListener<String, String>,
Serializable {
private boolean updated;
private boolean created;
//standard getters
public void onUpdated(
Iterable<CacheEntryEvent<? extends String,
? extends String>> events) throws CacheEntryListenerException {
this.updated = true;
}
public void onCreated(
Iterable<CacheEntryEvent<? extends String,
? extends String>> events) throws CacheEntryListenerException {
this.created = true;
}
}
それでは、テストを実行しましょう。
@Test
public void whenRunEvent__thenCorrect() throws InterruptedException {
this.listenerConfiguration
= new MutableCacheEntryListenerConfiguration<String, String>(
FactoryBuilder.factoryOf(this.listener), null, false, true);
this.cache.registerCacheEntryListener(this.listenerConfiguration);
assertEquals(false, this.listener.getCreated());
this.cache.put("key", "value");
assertEquals(true, this.listener.getCreated());
assertEquals(false, this.listener.getUpdated());
this.cache.put("key", "newValue");
assertEquals(true, this.listener.getUpdated());
}
8
CacheLoader
-
CacheLoader
を使用すると、
スルースルーモードを使用してキャッシュをメインデータストアとして扱い、そこからデータを読み取ることができます** 。
実際のシナリオでは、キャッシュに実際のストレージからデータを読み取らせることができます。
例を見てみましょう。まず、
CacheLoader
インターフェースを実装する必要があります。
public class SimpleCacheLoader
implements CacheLoader<Integer, String> {
public String load(Integer key) throws CacheLoaderException {
return "fromCache" + key;
}
public Map<Integer, String> loadAll(Iterable<? extends Integer> keys)
throws CacheLoaderException {
Map<Integer, String> data = new HashMap<>();
for (int key : keys) {
data.put(key, load(key));
}
return data;
}
}
それでは、
CacheLoader
実装を使用しましょう。
public class CacheLoaderTest {
private Cache<Integer, String> cache;
@Before
public void setup() {
CachingProvider cachingProvider = Caching.getCachingProvider();
CacheManager cacheManager = cachingProvider.getCacheManager();
MutableConfiguration<Integer, String> config
= new MutableConfiguration<>()
.setReadThrough(true)
.setCacheLoaderFactory(new FactoryBuilder.SingletonFactory<>(
new SimpleCacheLoader()));
this.cache = cacheManager.createCache("SimpleCache", config);
}
@Test
public void whenReadingFromStorage__thenCorrect() {
for (int i = 1; i < 4; i++) {
String value = cache.get(i);
assertEquals("fromCache" + i, value);
}
}
}
9結論
このチュートリアルでは、JCacheとは何かを見て、いくつかの実用的なシナリオでその重要な機能のいくつかを調べました。
いつものように、このチュートリアルの完全な実装はhttps://github.com/eugenp/tutorials/tree/master/libraries-data[over on GitHub]にあります。