`
marb
  • 浏览: 422191 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

google guava cache 处理

 
阅读更多

使用本地内存

 

Java代码  收藏代码
  1. LoadingCache<Long, User> cache = CacheBuilder.newBuilder().maximumSize(100)  
  2.                 .expireAfterAccess(5, TimeUnit.SECONDS).build(new CacheLoader<Long, User>() {  
  3.                     @Override  
  4.                     public User load(Long key) throws Exception {  
  5.                         logger.info("fetch from database");  
  6.                         return accountManager.getUser(key);  
  7.                     }  
  8.   
  9.                 });  

 

//设置缓存最大个数为100,缓存过期时间为5秒

 

回收的参数设置

 

1. 大小的设置:CacheBuilder.maximumSize(long) CacheBuilder.weigher(Weigher) CacheBuilder.maxumumWeigher(long)

2. 时间:expireAfterAccess(long, TimeUnit) expireAfterWrite(long, TimeUnit)

3. 引用:CacheBuilder.weakKeys() CacheBuilder.weakValues() CacheBuilder.softValues()

4. 明确的删除:invalidate(key) invalidateAll(keys) invalidateAll()

5. 删除监听器:CacheBuilder.removalListener(RemovalListener)

 

refresh机制

 

1. LoadingCache.refresh(K) 在生成新的value的时候,旧的value依然会被使用。

2. CacheLoader.reload(K, V) 生成新的value过程中允许使用旧的value

3. CacheBuilder.refreshAfterWrite(long, TimeUnit) 自动刷新cache

 

 

类似ConcurrentMap, 数据存在内存而不是file,外部server, 否则可以用memcached(待会儿解释)

如果value是通过正常的func使用key来得到的,那么可以使用CacheLoader,如果需要override,那么使用Callable

正常的使用方法是, LoadingCache.get(K), 将会查询cache,如果cache没有,那么会CacheLoader会将value加入cache,

注意的是,CacheLoader可能会抛出异常,所以如果你的LoadingCache中没有处理异常的话,那么最好使用 getUnchecked(K)方法

getAll(Iterable<? extends K>) 方法可以 批读取, 也是分成一个个key来处理,但是肯定比手工的效率更高, 可以通过override CacheLoader.loadAll 来更好的处理

 

get(K, Callable<V>), 这个方法实现了if cached, return; otherwise create, cache and return 模式

即如果cache了返回,如果没有通过callable接口的方法来create,然后cache,最后返回

 

Java代码  收藏代码
  1. Cache<Key, Value> cache = CacheBuilder.newBuilder()  
  2.     .maximumSize(1000)  
  3.     .build(); // look Ma, no CacheLoader  
  4. ...  
  5. try {  
  6.   // If the key wasn't in the "easy to compute" group, we need to  
  7.   // do things the hard way.  
  8.   cache.get(key, new Callable<Value>() {  
  9.     @Override  
  10.     public Value call() throws AnyException {  
  11.       return doThingsTheHardWay(key);  
  12.     }  
  13.   });  
  14. catch (ExecutionException e) {  
  15.   throw new OtherException(e.getCause());  
  16. }  

 

直接操作cache

使用cache.put(key,value), 同时可以使用Cache.asMap()来调用所以ConcurrentMap的方法来操作cache,但是通过asMap的数据不会自动loading到cache

 

三种清出cache的模式size-based eviction, time-based eviction, and reference-based eviction.

size-based:

 

Java代码  收藏代码
  1. LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()  
  2.        .maximumWeight(100000)  
  3.        .weigher(new Weigher<Key, Graph>() {  
  4.           public int weigh(Key k, Graph g) {  
  5.             return g.vertices().size();  
  6.           }  
  7.         })  
  8.        .build(  
  9.            new CacheLoader<Key, Graph>() {  
  10.              public Graph load(Key key) { // no checked exception  
  11.                return createExpensiveGraph(key);  
  12.              }  
  13.            });  

 

weigher,作用是将g.vertices().size()作为一个单位大小,重载此方法, 同时是在cache创建的时候计算

 

time-based:

expireAfterAccess(long, TimeUnit)  基于访问(read or write)

expireAfterWrite(long, TimeUnit)基于创建(after create)

 

reference-based

CacheBuilder.weakKeys(), 使用weak references来建立key,这样的话如果key没有引用了(strong or soft),key就会被垃圾回收,同时垃圾回收使用==来判断key值

CacheBuilder.weakValues(),  同上,作用到value上

CacheBuilder.softValues() , 对value进行排序,

 

主动清出cache

Cache.invalidate(key)

 Cache.invalidateAll(keys)

  Cache.invalidateAll()

 

 

clearUp,  cache不会自己clearup,一般需要通过线程定制,定时的clearup

 

refresh 操作, 与evict不同, 是给key一个new value, 同时如果在refresh时有访问,那么将会返回old value, 而evict则会等待evict结束返回new value

定义refresh一般使用异步的操作

如:

 

Java代码  收藏代码
  1. // Some keys don't need refreshing, and we want refreshes to be done asynchronously.  
  2. LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()  
  3.        .maximumSize(1000)  
  4.        .refreshAfterWrite(1, TimeUnit.MINUTES)  
  5.        .build(  
  6.            new CacheLoader<Key, Graph>() {  
  7.              public Graph load(Key key) { // no checked exception  
  8.                return getGraphFromDatabase(key);  
  9.              }  
  10.   
  11.              public ListenableFuture<Graph> reload(final Key key, Graph prevGraph) {  
  12.                if (neverNeedsRefresh(key)) {  
  13.                  return Futures.immediateFuture(prevGraph);  
  14.                } else {  
  15.                  // asynchronous!  
  16.                  return ListenableFutureTask.create(new Callable<Graph>() {  
  17.                    public Graph call() {  
  18.                      return getGraphFromDatabase(key);  
  19.                    }  
  20.                  });  
  21.                }  
  22.              }  
  23.            });  

 

 

 在refreshAfterWrite方法,会调用reload

 

数据

  提供了一些数据采集的方法

   CacheBuilder.recordStats() 方法启动了 cache的数据收集

    Cache.stats() 返回了一个CacheStats对象, 提供一些数据方法

    hitRate(), 请求点击率

    averageLoadPenalty(), 加载new value,花费的时间, 单位nanosecondes

    evictionCount(), 清除的个数

分享到:
评论
1 楼 yukaizhao 2014-08-13  
推荐一个很全的guava教程 http://outofmemory.cn/java/guava/

相关推荐

    Guava-Cache本地缓存案例代码

    Guava Cache是Google Guava库中的一个强大特性,它提供了高效的本地缓存解决方案,用于存储经常访问的数据,以减少对远程服务或计算的调用,从而提高应用性能。本案例代码将详细介绍Guava Cache的使用,包括缓存的...

    guava-cache.rar

    Guava Cache是Google Guava库中的一个强大特性,它提供了高效的本地缓存解决方案。在许多应用程序中,我们经常需要缓存数据以减少不必要的数据库查询或远程服务调用,提高系统性能。尽管分布式缓存如Redis在高并发和...

    Springboot整合GuavaCache缓存过程解析

    GuavaCache是Google开源的一款本地缓存机制,具有简单、强大、轻量级的特点。SpringBoot整合GuavaCache缓存过程解析是指使用SpringBoot框架将GuavaCache整合到应用程序中,以提高应用程序的性能和响应速度。 Guava...

    使用google guava 实现定时缓存功能

    在IT行业中,Google Guava库是一个非常强大的工具集,它为Java开发人员提供了一系列实用的集合、缓存、并发和I/O工具。本篇文章将详细探讨如何利用Guava库实现定时缓存功能,以提高应用的性能和效率。 首先,Guava...

    SpringBoot加入Guava Cache实现本地缓存代码实例

    Guava Cache 是一个高性能的缓存框架,由 Google 开发维护。它提供了一个灵活的缓存机制,可以根据实际需求进行配置。 首先,我们需要在 pom.xml 文件中添加 Guava 依赖项,以便使用 Guava Cache。添加以下依赖项:...

    第七章 企业项目开发--本地缓存guava cache1

    Guava Cache是Google Guava库中提供的一种高效、易用的本地缓存解决方案,它可以帮助减少对数据库或远程服务的频繁访问,提高应用程序的性能。Guava Cache支持自动过期、预加载、监听器等特性,使得在Java应用中实现...

    springboot使用GuavaCache做简单缓存处理的方法

    SpringBoot 使用 GuavaCache 实现简单缓存处理 在本篇文章中,我们将介绍如何使用 GuavaCache 在 SpringBoot 项目中实现简单的缓存处理。缓存机制可以减少对外部服务的查询请求,从而提高应用程序的性能。 问题...

    Guava-CacheDemo.rar

    Guava Cache是Google Guava库中的一个功能强大的本地缓存实现,它为Java开发者提供了高效、易用的缓存解决方案。Guava Cache的设计目标是为了帮助应用程序在内存中存储经常访问的数据,以减少对远程服务或者数据库的...

    不加密Google Guava视频教程.txt

    ├─Google Guava 第01讲-Joiner详细介绍以及和Java8Collector对比.wmv ├─Google Guava 第02讲-Guava Splitter详细讲解以及实战练习...├─Google Guava 第34讲-Guava Cache之RecordStats,CacheBuilderSpec详解.wmv

    google guava

    Google Guava是一个由Google开发并维护的开源Java库,它为Java开发者提供了许多实用的工具类和集合框架,极大地简化了常见的编程任务。这个框架包含了多个模块,如基础(base)、缓存(cache)、I/O(io)以及并发...

    Google Guava 官方教程

    **Google Guava官方教程** Google Guava 是一个广泛使用的 Java 库,它提供了一系列现代编程实用工具,旨在简化常见的编程任务。Guava 提供了集合框架的扩展、并发支持、缓存机制、字符串处理工具、I/O 工具以及...

    Guava-Cache-Demo:演示如何使用 Guava 缓存

    Guava Cache 是 Google 开源库 Guava 提供的一种高效、易用的缓存解决方案,它旨在帮助开发者在 Java 应用程序中实现本地缓存策略,以提高性能和减少对远程服务的调用。在这个名为 "Guava-Cache-Demo" 的项目中,...

    springbt_guava_cache.7z

    2. Guava Cache:Google的Guava库中的Cache模块,是一个强大的本地缓存解决方案,支持线程安全、容量限制、自动过期等功能,适用于需要高性能缓存场景。 二、集成Guava Cache 在Spring Boot项目中,我们需要以下...

    google开源项目guava.jar包

    此外,Guava的Cache模块则提供了一种内存缓存机制,可以根据预设策略自动清除过期的数据,有效提升了应用性能。 Guava对原生类型(如int、char等)提供了泛型支持,避免了装箱拆箱带来的额外开销。例如,Ints、...

    google guava 中文教程

    Google Guava是Google开发的一个开源Java库,它包含了一系列高级且实用的集合类、缓存机制、并发工具、字符串处理、I/O工具等,极大地提升了Java开发者的工作效率。Guava的目标是通过提供一系列现代实用工具,帮助...

    guavapdf-ch_GoogleGuava官方教程_

    Google Guava 是一个开源库,为Java开发人员提供了一组核心库,包括集合、缓存、并发工具、I/O工具、字符串处理、实用方法等。这个官方教程主要针对Guava库的使用进行详细介绍,帮助开发者更有效地利用Guava来优化...

    Java内存缓存工具Guava LoadingCache使用解析

    Java内存缓存工具Guava LoadingCache使用解析 Java内存缓存工具Guava LoadingCache是一个非常强大的缓存工具,广泛应用于各种Java项目中。Guava Cache是单个应用运行时的本地缓存,用于将数据缓存到JVM内存中,提高...

    Getting Started with Google Guava code

    3. **并发工具**:Guava 提供了线程安全的数据结构,如 LoadingCache 和 Lists.newConcurrentList(),以及原子类和工作队列,帮助开发者编写高效且线程安全的代码。 4. **函数式编程**:Guava 支持函数式编程风格,...

    google-guava.jar

    《谷歌Guava库详解》 谷歌Guava,全称为Google Guava,是Google推出的一款Java库,它包含一系列基础工具类,旨在简化Java开发工作,提高代码效率和可维护性。Guava的核心特性包括集合框架、缓存、原始类型支持、...

    谷歌guava的jar包和源码,值得收藏

    谷歌Guava库是一个广泛使用的Java库,它提供了许多核心库的实用工具类,包括集合、缓存、并发、I/O、字符串处理、泛型 utilities、错误处理、网络、数学运算以及类加载器支持等多个方面。Guava的目标是使Java编程...

Global site tag (gtag.js) - Google Analytics