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());
}
}