グアバキャッシュローカルキャッシュ(LoadingCache)

キャッシュを使用することができない開発アプリケーション、分散キャッシュ通常用い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 ]、キーと値を

公開された288元の記事 ウォン称賛88 ビュー430 000 +

おすすめ

転載: blog.csdn.net/ypp91zr/article/details/90712195