Guava cache 本地缓存

项目开发中很多程序员喜欢用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");

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值