LoadingCache的使用

Posted by KANG's BLOG on Tuesday, March 15, 2022

介绍

LoadingCache时Guava包中提供的缓存工具,其原理是调用get方法就会调用内部的getOrLoad(K key)方法,缓存中有对应的值则返回,没有则使用CacheLoader的load方法 。getOrLoad(K key)方法为线程安全方法,内部加锁

Maven坐标

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>27.1-jre</version>
</dependency>

如何使用

LoadingCache<Long, String> cache = CacheBuilder.newBuilder()
                //缓存池大小,在缓存项接近该大小时, Guava开始回收旧的缓存项
                .maximumSize(GUAVA_CACHE_SIZE)
                //设置时间对象没有被读/写访问则对象从内存中删除(在另外的线程里面不定期维护)
                .expireAfterAccess(10, TimeUnit.MINUTES)
                //移除监听器,缓存项被移除时会触发
                .removalListener(new RemovalListener <Long, String>() {
                    @Override
                    public void onRemoval(RemovalNotification<Long, String> rn) {
                        //执行逻辑操作
                    }
                })
                //开启Guava Cache的统计功能
                .recordStats()
                .build(cacheLoader);

主要方法

// 添加缓存
void put(K key, V value);

// 获取缓存,没有则执行load()方法后返回
V get(K key) throws ExecutionException;

// 获取缓存,没有则执行callable后返回
V get(K key, Callable<? extends V> loader) throws ExecutionException;
    
// 获取缓存,没有返回null
V getIfPresent(@CompatibleWith("K") Object key);

// 将key对应缓存置为失效
void invalidate(@CompatibleWith("K") Object key);

// 将所有缓存置为失效
void invalidateAll();

基于时间的清理或刷新缓存数据的方式

  • expireAfterAccess: 当缓存项在指定的时间段内没有被读或写就会被回收。

  • expireAfterWrite:当缓存项在指定的时间段内没有更新就会被回收。

  • refreshAfterWrite:当缓存项上一次更新操作之后的多久会被刷新。

缺点

超时机制非精确