Guava之缓存

Posted ityannic

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Guava之缓存相关的知识,希望对你有一定的参考价值。

技术图片

 

 

 

一、使用场景

  Guava Cache是本地缓存,当数据被重复查询多次,愿意耗费一些内存空间来减少查询的操作提高查询的速度,就可以使用Guava Cache。

二、使用方式

1.创建  

  LoadingCache是附带CacheLoader构建而成的缓存实现。创建自己的CacheLoader通常只需要简单地实现V load(K key) throws Exception方法。

  

    private static LoadingCache<Integer,String> cache = CacheBuilder.newBuilder()
            .build(new CacheLoader<Integer, String>() {
                @Override
                public String load(Integer id) {
                    return getData(id);
                }

                private String getData(Integer id) {
                    return "tt";
                }
            });
 

2.查询

   通过get(K key)查询数据,如果创建时没有抛异常,需要通过 getUnchecked(K key)查询非受检异常数据。

    public String findInfo(Integer id){
        String info = cache.getUnchecked(id);
        return info;
    }

  

3.缓存回收

  我们不能无限制的往内存中存放数据,需要适当的回收一些数据。

  1.基于容量的回收

  CacheBuilder<K, V> maximumSize(long maximumSize):容量超过了maximumSize就会触发回收,按最近最少使用规则回收。

 

      2.定时回收

  CacheBuilder<K, V> expireAfterAccess(long duration, TimeUnit unit) :超过了一段时间没有访问则会回收

  CacheBuilder<K, V> expireAfterWrite(long duration, TimeUnit unit):超过一段时间没有被修改则会回收

 

  3.基于引用的回收

  CacheBuilder<K, V> weakKeys():当没有弱引用时被回收。

 

4.刷新 

  可以对缓存中的数据进行刷新,这个刷新过程可以是异步的,这样就可以在刷新过程中如果有数据访问直接返回旧值,而不需要等待刷新完成。

  CacheBuilder<K, V> refreshAfterAccess(long duration, TimeUnit unit):当有数据访问后,每隔一段时间进行刷新。所以第一个用户获取当值有可能是旧值。如果没有用户访问,中间是不会刷新的。

  CacheBuilder<K, V> refreshAfterWrite(long duration, TimeUnit unit):当有数据修改后,每隔一段时间刷新。

 

示例:

    private static LoadingCache<Integer,String> cache = CacheBuilder.newBuilder()
            .maximumSize(10)
            .expireAfterWrite(10, TimeUnit.MINUTES)
            .build(new CacheLoader<Integer, String>() {
                @Override
                public String load(Integer id) {
                    return getData(id);
                }
                @Override
                public ListenableFuture<String> reload(Integer id, String old) {
                    ListenableFutureTask<String> futureTask = ListenableFutureTask.create(() -> getData(id));
                    SpringContextHolder.getBean(Executor.class).execute(futureTask);
                    return futureTask;
                }

                private String getData(Integer id) {
                    return "tt";
                }
            });

 

以上是关于Guava之缓存的主要内容,如果未能解决你的问题,请参考以下文章

缓存之王Caffeine Cache,性能比Guava更强,命中率更高!

Guava 源码分析之Cache的实现原理

真正的缓存之王,Google Guava 只是弟弟

关于guava之LoadingCache的一点

分布式系统缓存系列之guava cache

GUAVA本地缓存01_概述优缺点创建方式回收机制监听器统计异步锁定