1. Guava Cache 介绍
- Guava Cache 是 google guava 中的一个内存缓存模块,用于将数据缓存到 JVM 内存中。
- 使用场景
- 愿意消耗一些内存空间来提升速度。
- 预料到某些键会被查询一次以上。
- 缓存中存放的数据总量不会超出内存容量。
- Guava Cache 是单个应用运行时的本地缓存。它不把数据存放到文件或外部服务器。
2. 工具简单使用
1. pom.xml 文件中添加依赖
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>27.0.1-jre</version></dependency>
2. 创建 pojo 用户类
package com.study.cache.java.pojo;import java.io.Serializable;/** * 用户实体类 * @author 华夏紫穹 */public class User implements Serializable { private String userName; private String userId; public User(String userName, String userId) { this.userName = userName; this.userId = userId; } public String getUserName() { return userName; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } @Override public String toString() { return userId + " --- " + userName; }}
3. guava cache 简单使用实例
package com.study.cache.java.guava;import com.google.common.cache.*;import com.study.cache.java.pojo.User;import java.util.concurrent.ExecutionException;import java.util.concurrent.TimeUnit;/** * gvava cache 简单使用 * @author 华夏紫穹 */public class GuavaCacheDemo { public static void main(String[] args) throws ExecutionException { // 缓存接口这里是 LoadingCache,LoadingCache 在缓存项不存在时可以自动加载缓存 LoadingCache<String, User> userCache // CacheBuilder 的构造函数是私有的,只能通过其静态方法 newBuilder() 来获得 CacheBuilder 的实例 = CacheBuilder.newBuilder() // 设置并发级别为 8,并发级别是指可以同时写缓存的线程数 .concurrencyLevel(8) // 设置写缓存后 8 秒钟过期 .expireAfterWrite(8, TimeUnit.SECONDS) // 设置写缓存后 1 秒钟刷新 .refreshAfterWrite(1, TimeUnit.SECONDS) // 设置缓存容器的初始容量为 10 .initialCapacity(10) // 设置缓存最大容量为 100,超过 100 之后就会按照 LRU 最近最少使用算法来移除缓存项 .maximumSize(100) // 设置要统计缓存的命中率 .recordStats() // 设置缓存的移除通知 .removalListener(new RemovalListener<String, User>() { @Override public void onRemoval(RemovalNotification<String, User> removalNotification) { System.out.println(removalNotification.getKey() + " 被移除了,原因:" + removalNotification.getCause()); } }) // build 方法中可以指定 CacheLoader,在缓存不存在时通过 CacheLoader 的实现自动加载缓存 .build( new CacheLoader<String, User>() { @Override public User load(String key) throws Exception { System.out.println("缓存没有时,从数据库加载 " + key); // TODO jdbc 的代码 return new User("purplesky" + key, key); } } ); // 第一次读取 for (int i = 0; i < 20; i ++) { User user = userCache.get("uid" + i); System.out.println(user); } // 第二次读取 for (int i = 0; i < 20; i ++) { User user = userCache.get("uid" + i); System.out.println(user); } System.out.println("cache stats: "); System.out.println(userCache.stats().toString()); }}