Guava之缓存
一、使用场景
Guava Cache是本地缓存,当数据被重复查询多次,愿意耗费一些内存空间来减少查询的操作提高查询的速度,就可以使用Guava Cache。
二、使用方式
1.创建
LoadingCache是附带CacheLoader构建而成的缓存实现。创建自己的CacheLoader通常只需要简单地实现V load(K key) throws Exception方法。
private static LoadingCache<Integer,String> cache = CacheBuilder.newBuilder() .build(new CacheLoader<Integer, String>() { @Override public String load(Integer id) { return getData(id); } private String getData(Integer id) { return "tt"; } });
2.查询
通过get(K key)查询数据,如果创建时没有抛异常,需要通过 getUnchecked(K key)查询非受检异常数据。
public String findInfo(Integer id){ String info = cache.getUnchecked(id); return info; }
3.缓存回收
我们不能无限制的往内存中存放数据,需要适当的回收一些数据。
1.基于容量的回收
CacheBuilder<K, V> maximumSize(long maximumSize):容量超过了maximumSize就会触发回收,按最近最少使用规则回收。
2.定时回收
CacheBuilder<K, V> expireAfterAccess(long duration, TimeUnit unit) :超过了一段时间没有访问则会回收
CacheBuilder<K, V> expireAfterWrite(long duration, TimeUnit unit):超过一段时间没有被修改则会回收
3.基于引用的回收
CacheBuilder<K, V> weakKeys():当没有弱引用时被回收。
4.刷新
可以对缓存中的数据进行刷新,这个刷新过程可以是异步的,这样就可以在刷新过程中如果有数据访问直接返回旧值,而不需要等待刷新完成。
CacheBuilder<K, V> refreshAfterAccess(long duration, TimeUnit unit):当有数据访问后,每隔一段时间进行刷新。所以第一个用户获取当值有可能是旧值。如果没有用户访问,中间是不会刷新的。
CacheBuilder<K, V> refreshAfterWrite(long duration, TimeUnit unit):当有数据修改后,每隔一段时间刷新。
示例:
private static LoadingCache<Integer,String> cache = CacheBuilder.newBuilder() .maximumSize(10) .expireAfterWrite(10, TimeUnit.MINUTES) .build(new CacheLoader<Integer, String>() { @Override public String load(Integer id) { return getData(id); } @Override public ListenableFuture<String> reload(Integer id, String old) { ListenableFutureTask<String> futureTask = ListenableFutureTask.create(() -> getData(id)); SpringContextHolder.getBean(Executor.class).execute(futureTask); return futureTask; } private String getData(Integer id) { return "tt"; } });