2.2GuavaCache

Guava Cache是google提供的java API开发工具包的一块。
Guava Cache是一个全内存的本地缓存实现,它提供了线程安全的实现机制。整体上来说Guava cache 是本地缓存的不二之选,简单易用,性能好。

Guava Cache有两种创建方式:

  • 1.cacheLoader
  • 2.callable callback

通过这两种方法创建的cache,和通常用map来缓存的做法比,不同在于,这两种方法都实现了一种逻辑——从缓存中取key X的值,如果该值已经缓存过了,则返回缓存中的值,如果没有缓存过,可以通过某个方法来获取这个值。但不同的在于cacheloader的定义比较宽泛,是针对整个cache定义的,可以认为是统一的根据key值load value的方法。而callable的方式较为灵活,允许你在get的时候指定。

LoadingCache方法设值

public void loadingCache() {
        LoadingCache cacheBuilder = CacheBuilder
                .newBuilder()
                .build(new CacheLoader() {
                    @Override
                    public String load(String key) throws Exception {
                        String strProValue = "hello " + key + "!";
                        return strProValue;
                    }
                });
        try {
            System.out.println("jerry value:" + cacheBuilder.get("jerry"));
            System.out.println("peida value:" + cacheBuilder.get("peida"));
            cacheBuilder.put("harry", "ssdded");
            System.out.println("harry value:" + cacheBuilder.get("harry"));
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }

如果根据key获取value的方式一样,可以采用这种,比较方便

Callable方式设值

 public void callableCache() {
        Cache cache = CacheBuilder.newBuilder().maximumSize(1000).build();
        String resultVal = null;
        try {
            resultVal = cache.get("jerry", new Callable() {
                public String call() {
                    String strProValue = "hello " + "jerry" + "!";
                    return strProValue;
                }
            });
            System.out.println("jerry value : " + resultVal);
            resultVal = cache.get("peida", new Callable() {
                public String call() {
                    String strProValue = "hello " + "peida" + "!";
                    return strProValue;
                }
            });
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println("peida value : " + resultVal);
    }

这个稍灵活一些,可以根据key来灵活指定value的生成方式。

GuavaCacheUtil工具类

public class GuavaCacheUtil {
    private static volatile GuavaCacheUtil guavaCacheUtil;
    public static volatile Cache cache;

    public static GuavaCacheUtil getInstance() {
        if (null == guavaCacheUtil) {
            synchronized (GuavaCacheUtil.class) {
                if (null == guavaCacheUtil) {
                    guavaCacheUtil = new GuavaCacheUtil();
                }
            }
        }
        return guavaCacheUtil;
    }

    static {
        try {
            //30分钟过期
            cache = CacheBuilder.newBuilder().expireAfterWrite(30, TimeUnit.MINUTES).build();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除key
     *
     * @param key
     */
    public static void remove(String key) {
        cache.invalidate(key);
    }

    /**
     * 根据key取值
     *
     * @param key
     * @return
     */
    public static Object get(String key) {
        return cache.getIfPresent(key);
    }

    /**
     * 赋值
     *
     * @param key
     * @param value
     */
    public static void put(String key, Object value) {
        cache.put(key, value);
    }

    public static void main(String[] args) {
        GuavaCacheUtil.put("name", "jack");
        System.out.println(GuavaCacheUtil.get("name"));
    }
}

这是简化版的工具类,仅仅提供缓存的设置和取值功能,和EhCacheUtil的功能类似,用于cache使用场景比较多,而且需要灵活设值、删除key的地方。

源码下载

[本工程详细源码]
(https://github.com/chykong/java_component/tree/master/chapter2_2_guavaCache)

你可能感兴趣的:(2.2GuavaCache)