キャッシュを使用することができない開発アプリケーション、分散キャッシュ通常用いRedisの、Memcacheのまたehcacheをとして使用されるローカル・キャッシュの他の一般的に使用される、多くの中
プラグLoadingCacheローカルキャッシュが提供する枠組みの下で導入された今日のGoogleのグアバは、LoadingCacheとのConcurrentMapは、類似したスレッドセーフですが、そのような期限切れの戦略としてよりのConcurrentMapよりもいくつかの他の機能、
利点
のみを表示することができる要素を取り除く1、スレッドセーフキャッシュ、および類似のConcurrentMap、前者添加以上の元素の有効期限ポリシー、。
図2は、三つの基本的なキャッシュの回復方法を提供する:基準容量回収リサイクル、回収およびタイミングベースに基づきます。2つの方法でタイミング回復:書き込み時間、最も初期の最初の書き込みの回復に応じて、アクセス時間に応じて、最初は、最近アクセス回復しました。
3、キャッシュ/ヒット状況を監視し、負荷。
4つの統合複数の操作は、呼び出しは、データソース(DB、Redisの)他の場所から取得するとき、あなたはミスをキャッシュできる方法を取得し、キャッシュにロード
簡単に、単純なクラスを作成(改善の余地)
package com.shentb.hmb.cache;
import com.google.common.cache.*;
import com.shentb.hmb.service.impl.LoginService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
@Component
public final class LoadingLocalCache {
private static LoginService loginService;
private static Logger logger = LoggerFactory.getLogger(LoadingLocalCache.class);
private static LoadingCache<String, Object> loadingCache;
private static LoadingLocalCache loadingLocalCache;
private static int DEFAULT_CONCURRENCY_LEVEL= 4;
private static int DEFAULT_EXPIRE= 1800;
private static int DEFAULT_INITIAL_CAPACITY= 16;
private static int DEFAULT_MAXIMUM_SIZE= 100;
private static TimeUnit DEFAULT_TIME_UNIT= TimeUnit.SECONDS;
@Autowired
public void setLoginService(LoginService loginService) {
LoadingLocalCache.loginService = loginService;
}
static {
init();
}
private LoadingLocalCache(){}
protected static void init() {
loadingCache= CacheBuilder
.newBuilder()
//并发级别(同时写入缓存的线程数)
.concurrencyLevel(DEFAULT_CONCURRENCY_LEVEL)
//过期时间
.expireAfterWrite(DEFAULT_EXPIRE,DEFAULT_TIME_UNIT)
//初始容量
.initialCapacity(DEFAULT_INITIAL_CAPACITY)
//最大容量,超过之后默认按照LRU算法最近使用最少移除缓存项
.maximumSize(DEFAULT_MAXIMUM_SIZE)
//设置统计缓存的命中率
.recordStats()
.removalListener(new RemovalListener<Object, Object>() {
@Override
public void onRemoval(RemovalNotification<Object, Object> notification) {
logger.info(notification.getKey() + " was removed, cause is " + notification.getCause());
}
})
//build方法中可以指定CacheLoader,在缓存不存在时通过CacheLoader的实现自动加载缓存
.build(
new CacheLoader<String, Object>() {
@Override
public Object load(String key) throws Exception {
return loginService.selectByPhoneNo(key);
}
}
);
}
public static Object put(String key, Object value){
loadingCache.put(key, value);
return value;
}
public static Object get(String key) throws Exception {
return loadingCache.get(key);
}
public static <T> T checkNotNull(T reference) {
if (reference == null) {
throw new NullPointerException();
}
return reference;
}
// System.out.println(sellerContactVOCache.stats().toString());
}
一般的な方法:
GET(K) :このメソッドは、のCacheLoaderがアトミック・キャッシュに新しい値をロードする(キャッシュは上記と言われている時間は、Loadメソッドを実行する値がない)、または使用、キャッシュされた値を返すのいずれか
PUT(キー、値):このメソッドは、直接マッピングがキーオフされる前に直接値が上書きされますされ、キャッシュに値を挿入表示することができます。
キャッシュ・リカバリ:
CacheBuilder.maximumSize(ロング):このメソッドは、キャッシュエントリ数が(実際には、あなたは最大容量の地図として理解することができる)固定値を超えていない指定、試すキャッシュエントリを全体的に使用され、最近使用したり、まれに回収されません
タイミング回復(時限立ち退き):
expireAfterAccess(ロング、TimeUnitで):キャッシュエントリは、与えられた時間/書き込みアクセス中に読まれていないが、その後回復しました。なお、このリカバリ順序と同じキャッシュ・サイズベースのリカバリ。
expireAfterWrite(ロング、TimeUnitで):与えられた時間内にキャッシュエントリが書き込みアクセス(作成または上書きすること)ではない、その後、回復しました。そのキャッシュデータは常に一定時間後に利用できなくなった古いである場合、この回復は望ましい方法です。
明確な明示的な:
いつでも、あなたは明示的ではなく、それがリサイクルされるまで待つよりも、キャッシュエントリをクリアすることができます。
個々のクリア:Cache.invalidate(キー) 一括解除:Cache.invalidateAll(キー)は 、すべてのキャッシュエントリをクリア:Cache.invalidateAll()
リスナーを削除します
CacheBuilder.removalListener(RemovalListener)キャッシュエントリが削除されたとき、あなたはいくつかの追加の操作を行うためのリスナーを宣言することができます。キャッシュ・エントリが除去され、RemovalListener取得除去通知[ RemovalNotification理由[除去することを含む]、RemovalCause ]、キーと値を