欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Guava cache 本地缓存

程序员文章站 2022-06-19 11:32:51
...

项目开发中很多程序员喜欢用HashMap来构建本地缓存,存在并发、内存泄漏、刷新机制不健全(某些场景下我们希望定时删除或刷新缓存)、容量限制(当超过设置的最大缓存量时使用LRU算法淘汰最久未使用的缓存数据)等问题,推荐使用Google的Guava来构建本地缓存。

  • 引包

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>20.0</version>
</dependency>  
  • 构建缓存

//实例:双层LoadingCache,全局缓存map中嵌套某数据类型的缓存map
private  final LoadingCache<String, LoadingCache<String,DataType>> cacheMap
            = CacheBuilder.newBuilder()
            .maximumSize(200) // 设置缓存的最大容量
            .build(new CacheLoader<String, LoadingCache<String,DataType>>() {
                @Override
                public LoadingCache<String,DataType> load(String key) throws Exception {
                    return CacheBuilder.newBuilder()
                    .maximumSize(2000) 
                    .expireAfterWrite(10, TimeUnit.MINUTES) //失效时间
                    .refreshAfterWrite(2, TimeUnit.MINUTES) //刷新时间
                    .build(new CacheLoader<String, DataType>() {
                        @Override
                        public DataType load(String key1) throws Exception {
                            return getDataType(key1);
                        }
                    });
                }
            });

使用CacheBuilder能构建出两种类型的cache:Cache与LoadingCache,上面的代码为LoadingCache。(使用Guava cache构建本地缓存

Cache是通过CacheBuilder的build()方法构建,它是Gauva提供的最基本的缓存接口,并且它提供了一些常用的缓存api:

Cache<Object, Object> cache = CacheBuilder.newBuilder().build();
// 放入/覆盖一个缓存
cache.put("k1", "v1");
// 获取一个缓存,如果该缓存不存在则返回一个null值
Object value = cache.getIfPresent("k1");
// 获取缓存,当缓存不存在时,则通Callable进行加载并返回。该操作是原子
Object getValue = cache.get("k1", new Callable<Object>() {
	@Override
	public Object call() throws Exception {
		return null;
	}
});

LoadingCache继承自Cache,在构建LoadingCache时,需要通过CacheBuilder的build(CacheLoader<? super K1, V1> loader)方法构建

 LoadingCache<Object, Object> loadingCache = CacheBuilder.newBuilder().build(new CacheLoader<Object, Object>() {
            @Override
            public Object load(Object key) throws Exception {
                return null;
            }
        });
// 获取缓存,当缓存不存在时,会通过CacheLoader自动加载,该方法会抛出ExecutionException异常
loadingCache.get("k1");
// 以不安全的方式获取缓存,当缓存不存在时,会通过CacheLoader自动加载,该方法不会抛出异常
loadingCache.getUnchecked("k1");