一、概述
Guava Cache是在内存中缓存数据,相比较与数据库或redis存储,访问内存中的数据会更加高效。合理的利用缓存可以极大的改善应用程序的性能。
二、应用场景
- 愿意消耗一些内存空间来提升速度。
- 预料到某些键会被多次查询。
- 缓存中存放的数据总量不会超出内存容量。
三、用法
- 添加依赖
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>23.0</version> </dependency>
- 创建
通过CacheBuilder构建一个缓存对象,CacheBuilder类采用builder设计模式,它的每个方法都返回CacheBuilder本身,直到builder方法被调用。
Cache<String,String> cache = CacheBuilder.newBuilder().build();
cache.put("key","value");
System.out.println(cache.getIfPresent("key"));
3.设置最大存储
在构建缓存对象时,指定缓存最大存储数量。当Cache的数量达到最大值后再调用put方法向其中添加对象,Guava会从其删除一个一条,在存储新的Key。
Cache<Object, Object> cache = CacheBuilder
.newBuilder()
.maximumSize(5)
.build();
cache.put("1", "1");
cache.put("2", "2");
cache.put("3", "3");
cache.put("4", "4");
cache.put("5", "5");
cache.put("6", "6");
System.out.println("key=1:"+cache.getIfPresent("1"));
System.out.println("key=2:"+cache.getIfPresent("2"));
System.out.println("key=3:"+cache.getIfPresent("3"));
System.out.println("key=4:"+cache.getIfPresent("4"));
System.out.println("key=5:"+cache.getIfPresent("5"));
System.out.println("key=6:"+cache.getIfPresent("6"));
结果:
key=1:null
key=2:2
key=3:3
key=4:4
key=5:5
key=6:6
经过多次测试,应该是按顺序删除。
4.设置过期时间
在构建Cache对象时,可以通过CacheBuilder类的expireAfterAccess和expireAfterWrite两个方法为缓存中的对象指定过期时间,过期的对象将会被缓存自动删除。
expireAfterWrite表示写入后存在多长时间;
expireAfterAccess表示多久没有被访问后过期。
Cache<Object, Object> cache = CacheBuilder
.newBuilder()
.maximumSize(5)
.expireAfterWrite(1, TimeUnit.MINUTES) //缓存在一分钟后会过期
.build();