用Guava做本地缓存示例

缓存的作用

提升系统性能,暂时在内存中保存业务系统的数据处理结果,并且等待下次访问使用

本地缓存和分布式缓存

缓存分为本地缓存与分布式缓存。本地缓存为了保证线程安全问题,一般使用ConcurrentMap的方式保存在内存之中,而常见的分布式缓存则有Redis,MongoDB等。
本地缓存适用于数据量较小或变动较少的数据,因为变动多需要考虑到不同实例的缓存一致性问题,而数据量大则需要考虑缓存回收策略及GC相关的问题

Guava Cache

Guava Cache是一个全内存的本地缓存实现,它提供了线程安全的实现机制。整体上来说Guava cache 是本地缓存的不二之选,简单易用,性能好。
Guava是Google提供的一个核心Java类库,其中包含:集合【collections】、缓存【caching】、原生类型支持【primitives support】、并发库【concurrency libraries】、通用注解【common annotations】、字符串处理【string processing】、I/O 等等。

创建方法

通过CacheBuilder类构建一个缓存对象,CacheBuilder类采用builder设计模式,它的每个方法都返回CacheBuilder本身,直到build方法被调用。

常用配置
initialCapacity(100):初始容量
maximumSize(1000):最大记录数,超出容量删除数据
maximumWeight(long):指定最大总重,超出权重删除数据
weigher(Weigher):指定一个权重函数
expireAfterWrite: 写缓存后多久过期
expireAfterAccess: 读写缓存后多久过期
Cache.invalidate(key):清除单个key
Cache.invalidateAll(keys):批量清除key
Cache.invalidateAll():清除所有缓存项

weakKeys():使用弱引用存储键。当键没有其它(强或软)引用时,缓存项可以被垃圾回收
weakValues():使用弱引用存储值。当值没有其它(强或软)引用时,缓存项可以被垃圾回收
softValues():使用软引用存储值。软引用只有在响应内存需要时,才按照全局最近最少使用的顺序回收。

LoadingCache:使用自定义ClassLoader加载数据,置入内存中。从LoadingCache中获取数据时,若数据存在则直接返回;若数据不存在,则根据ClassLoader的load方法加载数据至内存,然后返回该数据

import com.google.common.cache.*;

import javax.annotation.CheckForNull;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

public class GuavaTest {
    public static void main(String[] args) throws ExecutionException {
        GuavaTest test = new GuavaTest();
        test.cache.put(1, 2);
        System.out.println(test.cache.getIfPresent(2));
        test.cache1.put("1", "1");
        System.out.println(test.cache1.get("1"));
    }

    Cache<Integer, Integer> cache = CacheBuilder.newBuilder()
            .maximumSize(3)
            .expireAfterWrite(5, TimeUnit.MINUTES)
            .build();


    LoadingCache<String, String> cache1 = CacheBuilder.newBuilder()
            .build(new CacheLoader<String, String>() {
                @Override
                public String load(String str) throws Exception {
                    return "a";
                }
            });
}

你可能感兴趣的:(guava,缓存)