package com.ywt.mg.core.utils;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;

import java.util.concurrent.TimeUnit;

/**
 * Guava cache 工具类，主要用于提供单例 Cache 对象，便于缓存管理
 * 由于 Guava cache 不支持在 runtime 修改 maxSize, expireTime 这些属性，只能初始化的时候指定。
 * @author Walker
 * Created on 2020/6/19
 */
public final class CacheUtil {

    private static volatile Cache<String, Object> cache;
    /**
     * 用于初始化cache的参数及其缺省值
     */
    private static final int EXPIRE_TIME = 5;
    private static final int DEFAULT_SIZE = 100;

    private static final int MAX_SIZE = 100000;
    /**
     * 时间单位（分钟）
     */
    private static final TimeUnit timeUnit = TimeUnit.MINUTES;

    public static Cache<String, Object> getInstance() {
        if (cache == null) {
            synchronized (CacheUtil.class) {
                if (cache == null) {
                    cache = CacheBuilder.newBuilder()
                            //设置缓存容器的初始容量
                            .initialCapacity(DEFAULT_SIZE)
                            //缓存数据的最大条目
                            .maximumSize(MAX_SIZE)
                            //定时回收:缓存项在给定时间内没有被写访问（创建或覆盖），则回收。
                            .expireAfterWrite(EXPIRE_TIME, timeUnit)
                            //启用统计->统计缓存的命中率等
                            .recordStats()
                            //设置缓存的移除通知
                            .build();
                }
            }
        }
        return cache;
    }

}
