看了源码实现,发现有4-5千行代码,就没有去好好看了,直接上案例
import com.google.common.cache.*;
import com.study.cache.java.pojo.User;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
// https://github.com/google/guava
public class GuavaCacheDemo {
public static void main(String[] args) throws ExecutionException {
//缓存接口这里是LoadingCache,LoadingCache在缓存项不存在时可以自动加载缓存
LoadingCache userCache
//CacheBuilder的构造函数是私有的,只能通过其静态方法newBuilder()来获得CacheBuilder的实例
= CacheBuilder.newBuilder()
//设置并发级别为8,并发级别是指可以同时写缓存的线程数
.concurrencyLevel(8)
//设置写缓存后8秒钟过期
.expireAfterWrite(1, TimeUnit.SECONDS)
//设置写缓存后1秒钟刷新
.refreshAfterWrite(1, TimeUnit.SECONDS)
//设置缓存容器的初始容量为10
.initialCapacity(10)
//设置缓存最大容量为100,超过100之后就会按照LRU最近虽少使用算法来移除缓存项
.maximumSize(100)
//设置要统计缓存的命中率
.recordStats()
//设置缓存的移除通知
.removalListener(new RemovalListener
执行结果如下:
"D:Program FilesJavajdk-9.0.4binjava.exe" "-javaagent:D:Program FilesJetBrainsIntelliJ IDEA Community Edition 2021.2.3libidea_rt.jar=65114:D:Program FilesJetBrainsIntelliJ IDEA Community Edition 2021.2.3bin" -Dfile.encoding=UTF-8 -classpath "E:动脑学院高并发分布式236-高并发缓存( 从Redis入门到写出高性能缓存组件)-20190702-hash课件java-demotargetclasses;C:UsersDELL.m2repositoryjavaxcachecache-api1.1.0cache-api-1.1.0.jar;C:UsersDELL.m2repositorycomgoogleguavaguava27.0.1-jreguava-27.0.1-jre.jar;C:UsersDELL.m2repositorycomgoogleguavafailureaccess1.0.1failureaccess-1.0.1.jar;C:UsersDELL.m2repositorycomgoogleguavalistenablefuture9999.0-empty-to-avoid-conflict-with-guavalistenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar;C:UsersDELL.m2repositorycomgooglecodefindbugsjsr3053.0.2jsr305-3.0.2.jar;C:UsersDELL.m2repositoryorgcheckerframeworkchecker-qual2.5.2checker-qual-2.5.2.jar;C:UsersDELL.m2repositorycomgoogleerrorproneerror_prone_annotations2.2.0error_prone_annotations-2.2.0.jar;C:UsersDELL.m2repositorycomgooglej2objcj2objc-annotations1.1j2objc-annotations-1.1.jar;C:UsersDELL.m2repositoryorgcodehausmojoanimal-sniffer-annotations1.17animal-sniffer-annotations-1.17.jar" com.study.cache.java.guava.GuavaCacheDemo
缓存没有时,从数据库加载uid0
User [userName=cacheuid0, userId=uid0]
缓存没有时,从数据库加载uid1
User [userName=cacheuid1, userId=uid1]
缓存没有时,从数据库加载uid2
User [userName=cacheuid2, userId=uid2]
缓存没有时,从数据库加载uid3
User [userName=cacheuid3, userId=uid3]
缓存没有时,从数据库加载uid4
User [userName=cacheuid4, userId=uid4]
第一次读取完成------------------------------
User [userName=cacheuid0, userId=uid0]
User [userName=cacheuid1, userId=uid1]
User [userName=cacheuid2, userId=uid2]
User [userName=cacheuid3, userId=uid3]
User [userName=cacheuid4, userId=uid4]
第二次读取完成------------------------------
uid0 被移除了,原因: EXPIRED
缓存没有时,从数据库加载uid0
User [userName=cacheuid0, userId=uid0]
uid1 被移除了,原因: EXPIRED
缓存没有时,从数据库加载uid1
User [userName=cacheuid1, userId=uid1]
uid2 被移除了,原因: EXPIRED
uid3 被移除了,原因: EXPIRED
缓存没有时,从数据库加载uid2
User [userName=cacheuid2, userId=uid2]
缓存没有时,从数据库加载uid3
User [userName=cacheuid3, userId=uid3]
uid4 被移除了,原因: EXPIRED
缓存没有时,从数据库加载uid4
User [userName=cacheuid4, userId=uid4]
cache stats:
CacheStats{hitCount=5, missCount=10, loadSuccessCount=10, loadExceptionCount=0, totalLoadTime=2519100, evictionCount=5}
Process finished with exit code 0
这个guava的缓存,是基于内存的缓存,可以通过创建时指定过期时间,刷新时间,这样,在key到达指定的过期时间后会自动过期,并且在指定的刷新时间到达时,自动去刷新数据,使用时直接使用key去获取对象,如果对象不存在,则会自动去执行build里面的接口实现load方法,从数据库重新加载数据到缓存



