I.概要
キャッシングは、Web開発に不可欠で重要なツールです。キャッシングと言えば、redisやmemcachedなどのより多くのKey-Valueストレージシステムが考えられます。これらはデータをメモリに保存し、広く使用されている分散展開をサポートします。しかし、プロジェクトにそれらを導入したくない場合もあり(比較的言えば、それらは「重い」ので、十分な理由がない場合は、システムの複雑さを増やさないようにする必要があります)、必要なデータの量キャッシュは現在のサーバーには影響しませんメモリは影響を受けます。現時点では、ローカルキャッシュの使用を検討できます。つまり、頻繁にクエリを実行する必要があるデータは、JVMメモリに配置されます。google guavaが提供するキャッシュは、ローカルキャッシュに適しています。
Guavaの公式ウェブサイトによると、GuavaCacheは次の状況で検討できます。
- 速度を上げるためにいくらかのメモリスペースを消費することをいとわない
- 特定のキーが複数回照会されることが予想されます
- キャッシュに保存されるデータの総量がメモリ容量を超えることはありません
2.グアバキャッシュの使用
LoadingCacheは、キャッシュのサブインターフェイスです。名前が示すように、ユーザーは読み込み方法を設定できます。キャッシュが失われた場合は、このメソッドを使用してキーに対応する値を取得し、それをキャッシュに入れます。LoadingCacheの使用量が多いため、以下でその使用法を紹介します。
2.1LoadingCacheの定義
LoadingCache<Integer, String> numberTranlation = CacheBuilder.newBuilder()
.maximumSize(10) //最大能缓存的容量
.expireAfterAccess(1, TimeUnit.DAYS) //过期策略:1天没被访问后过期
.recordStats() //开启统计功能
.build(new CacheLoader<Integer, String>() {
@Override
public String load(Integer integer) throws Exception {
return NumberTranslationApi.translation(integer);
}
});
LoadingCacheは、コンストラクターCacheBuilderを使用して、ビルダーモードを使用して構築され、各メソッドの戻り値はCacheBuilder自体です。buildメソッドが使用されるまで、LoadingCacheが返されます。
CacheBuilderは、LoadingCacheを設定するための多くのメソッドを提供します。
容量設定:
//设置缓存的最大容量,添加元素时若发现容量已满则按一定规则删除之前的元素
maximumSize(100);
有効期限の設定:
//过期时间设置,如果一个元素1天内没有被访问则失效
expireAfterAccess(1, TimeUnit.DAYS);
//过期时间设置,如果一个元素1天内没有被写入更新则失效
expireAfterWrite(1,TimeUnit.DAYS);
統計をオンにします。
recordStats() ;
さらに、統計を開いた後に統計を出力する場合は、Cache.stats()メソッドを呼び出すことができます。
CacheLoaderをbuildメソッドに渡す必要があり、そのloadメソッドをリロードする必要があります。loadメソッドの機能は、getメソッドを介してLoadingCacheから値を取得できない場合に、値をロードしてキャッシュに入れることです。
この構築メソッドは、他のインターフェースやメソッドから値を取得する必要がある状況に非常に適しています。CacheLoaderのロードは、インターフェースやメソッドから値を取得する方法を定義します。
2.2 getメソッドを使用して、キャッシュから値を取得します
//numberTranlation如2.1节定义
numberTranlation.get(1);
numberTranlation.getIfPresent(1);
getメソッドを使用してキャッシュ内の値を取得します。値がキャッシュ内に存在しない場合は、CacheLoader.loadメソッドを介してロードして戻ります。
getメソッドとは少し異なります。getIfPresentメソッドは、キャッシュが失われたときにnullを返し、CacheLoader.loadメソッドを呼び出してデータをロードしません。
これら2つの方法の違いについては、次の例を見て理解してください。
numberTranlation.getIfPresent(1); //返回null
numberTranlation.get(1); //返回“one”,执行了load方法载入
numberTranlation.getIfPresent(1); //返回"one"
numberTranlation.get(1); //返回“one”
2.3 getメソッドの呼び出し可能なパラメーターバージョンを使用して、loadメソッドをオーバーライドします
int key = 20;
Cache.numberTranlation.get(key, new Callable<String>() {
@Override
public String call() throws Exception {
return NumberTranslationApi.translation(key);
}
});
GuavaのCacheインターフェースは、Callableを使用したgetのバージョンも定義します。このメソッドを使用すると、キャッシュが失われると、Callableが値の計算に使用され、キャッシュにロードされます。
注意:
对于普通Cache也是使用CacheBuilder构造的,只是不需要给builder传入CacheLoader。
而其它maximumSize等方法也和LoadingCache一样使用。换句话说LoadingCache只是
多了一个CacheLoader来规定未命中缓存时的操作。
另外需要注意的是下面的get(key,new Callable()……)方法,也适用于普通的Cache。即
对于普通Cache也可以定义未命中时的载入操作。
3.教材
この記事では、Guava Cacheの基本的な使用法のみを紹介します。その実装原理を理解したい場合は、GuavaCache実装原理の分析に進んでください。
githubのgoogleguavaキャッシング部門のソースコードのアドレスは、誰もが学ぶのに便利なように以下に添付されています。
https://github.com/google/guava/tree/master/guava/src/com/google/common/cache
パブリックアカウントに注意を払い、初めて私からより多くの記事を受け取ります