- Guava Tutorial
 - Guava - Home
 - Guava - Overview
 - Guava - Environment Setup
 - Guava - Optional Class
 - Guava - Preconditions Class
 - Guava - Ordering Class
 - Guava - Objects Class
 - Guava - Range Class
 - Guava - Throwables Class
 - Guava - Collections Utilities
 - Guava - Caching Utilities
 - Guava - String Utilities
 - Guava - Primitive Utilities
 - Guava - Math Utilities
 
- Guava Useful Resources
 - Guava - Quick Guide
 - Guava - Useful Resources
 - Guava - Discussion
 
Guava - 缓存实用程序
Guava 通过接口 LoadingCache<K,V> 提供了非常强大的基于内存的缓存机制。值会自动加载到缓存中,并且它提供了许多可满足缓存需求的实用方法。
接口声明
以下是com.google.common.cache.LoadingCache<K,V>接口的声明-
@Beta @GwtCompatible public interface LoadingCache<K,V> extends Cache<K,V>, Function<K,V>
接口方法
| 先生编号 | 方法及说明 | 
|---|---|
| 1 | 
 V 应用(K 键) 已弃用。提供以满足Function接口;请改用 get(K) 或 getUnchecked(K)。  | 
| 2 | 
 ConcurrentMap<K,V> asMap() 以线程安全映射的形式返回存储在此缓存中的条目的视图。  | 
| 3 | 
 V 获取(K 键) 返回与此缓存中的键关联的值,如有必要,首先加载该值。  | 
| 4 | 
 ImmutableMap<K,V> getAll(Iterable<? 扩展 K> 键) 返回与键关联的值的映射,并在必要时创建或检索这些值。  | 
| 5 | 
 V getUnchecked(K 键) 返回与此缓存中的键关联的值,如有必要,首先加载该值。  | 
| 6 | 
 无效刷新(K键) 为键加载新值,可能是异步的。  | 
加载缓存示例
使用您选择的任何编辑器(例如C:/> Guava)创建以下 java 程序。
GuavaTester.java
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import com.google.common.base.MoreObjects;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
public class GuavaTester {
   public static void main(String args[]) {
   
      //create a cache for employees based on their employee id
      LoadingCache<String, Employee> employeeCache = 
         CacheBuilder.newBuilder()
         .maximumSize(100)                             // maximum 100 records can be cached
         .expireAfterAccess(30, TimeUnit.MINUTES)      // cache will expire after 30 minutes of access
         .build(new CacheLoader<String, Employee>() {  // build the cacheloader
            
            @Override
            public Employee load(String empId) throws Exception {
               //make the expensive call
               return getFromDatabase(empId);
            } 
         });
      try {			
         //on first invocation, cache will be populated with corresponding
         //employee record
         System.out.println("Invocation #1");
         System.out.println(employeeCache.get("100"));
         System.out.println(employeeCache.get("103"));
         System.out.println(employeeCache.get("110"));
         
         //second invocation, data will be returned from cache
         System.out.println("Invocation #2");
         System.out.println(employeeCache.get("100"));
         System.out.println(employeeCache.get("103"));
         System.out.println(employeeCache.get("110"));
      } catch (ExecutionException e) {
         e.printStackTrace();
      }
   }
   private static Employee getFromDatabase(String empId) {
   
      Employee e1 = new Employee("Mahesh", "Finance", "100");
      Employee e2 = new Employee("Rohan", "IT", "103");
      Employee e3 = new Employee("Sohan", "Admin", "110");
      Map<String, Employee> database = new HashMap<String, Employee>();
      
      database.put("100", e1);
      database.put("103", e2);
      database.put("110", e3);
      
      System.out.println("Database hit for" + empId);
      
      return database.get(empId);		
   }
}
class Employee {
   String name;
   String dept;
   String emplD;
   public Employee(String name, String dept, String empID) {
      this.name = name;
      this.dept = dept;
      this.emplD = empID;
   }
   
   public String getName() {
      return name;
   }
   
   public void setName(String name) {
      this.name = name;
   }
   
   public String getDept() {
      return dept;
   }
   
   public void setDept(String dept) {
      this.dept = dept;
   }
   
   public String getEmplD() {
      return emplD;
   }
   
   public void setEmplD(String emplD) {
      this.emplD = emplD;
   }
   @Override
   public String toString() {
      return MoreObjects.toStringHelper(Employee.class)
      .add("Name", name)
      .add("Department", dept)
      .add("Emp Id", emplD).toString();
   }	
}
验证结果
使用javac编译器编译该类,如下所示 -
C:\Guava>javac GuavaTester.java
现在运行 GuavaTester 查看结果。
C:\Guava>java GuavaTester
查看结果。
Invocation #1
Database hit for100
Employee{Name=Mahesh, Department=Finance, Emp Id=100}
Database hit for103
Employee{Name=Rohan, Department=IT, Emp Id=103}
Database hit for110
Employee{Name=Sohan, Department=Admin, Emp Id=110}
Invocation #2
Employee{Name=Mahesh, Department=Finance, Emp Id=100}
Employee{Name=Rohan, Department=IT, Emp Id=103}
Employee{Name=Sohan, Department=Admin, Emp Id=110}