概述
LoadingCache缓存使用(LoadingCache)
一 、引入依赖
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>24.1-jre</version>
</dependency>
二 、LoadingCache的缓存原理
调用get方法就会内部调用getOrLoad(K key)方法,缓存中有对应的值则返回,没有则使用CacheLoader的load方法 。getOrLoad(K key)方法为线程安全方法,内部加锁
三、代码案例
/抽象父类代码/
package com.example.demo;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import work.TUser;
import java.util.concurrent.TimeUnit;
public abstract class CacheDemo<K,V extends TUser> {
private static final Logger logger = LoggerFactory.getLogger(CacheDemo.class);
//缓存容器的初始容量
protected int initialCapacity = 512;
//并发等级(根据cpu情况设置
推荐内核数*2)
protected int concurrencyLevel = 4;
// 最大缓存条数。子类在构造方法中调用setMaximunSize(int size)来更改
protected int maximumSize = 1000;
// 当缓存项在指定的时间段内没有被读或写就会被回收
protected int expireAfterAcess = 60;
//
时间单位(分钟)
protected TimeUnit timeUnit = TimeUnit.MINUTES;
// 自动加载缓存、避免出现脏读
protected volatile LoadingCache<K,V> loadingCache;
protected void init(){
loadingCache = CacheBuilder.newBuilder().
initialCapacity(initialCapacity).// 缓存容器的初始容量
maximumSize(maximumSize).// 缓存容器最大缓存容量
concurrencyLevel(concurrencyLevel). // 设置并发级别、并发级别是指同时写缓存的线程数
expireAfterAccess(expireAfterAcess,timeUnit).
// 当缓存想在指定的时间段内没有被读或写就会被回收
build(new CacheLoader<K, V>() {
/**
* 读取数据并缓存起来,null不会缓存
* @param k
* @return
* @throws Exception
*/
@Override
public V load(K k) throws Exception {
logger.debug("开始缓存" + k +"!");
// todo 子类重写此方法,从数据库获取数据的逻辑。
return queryKeyDataInfo(k);
}
});
}
/**
* 重写获取实例的方法获取当前类的实例
* @return
*/
protected LoadingCache<K,V> getLoadingCache(){
// 使用双重校验锁保证只有一个cache实例
if (loadingCache == null) {
synchronized (this) {
if (loadingCache == null) {
this.init();
}
}
}
return loadingCache;
}
protected abstract V queryKeyDataInfo(K key);
/**
* 获取当前类的名字(不含全路径)
* @return
*/
protected String getSimpleClassName(){
return this.getClass().getSimpleName();
}
}
/子类方法继承抽象父类,真正使用的代码/
package com.example.demo;
import work.TUser;
public class ProductCacheDemo extends CacheDemo<String,TUser> {
@Override
protected TUser queryKeyDataInfo(String key) {
return null;
}
/**
* 上游调用此方法,从而调用父类的get方法
* @param productNo
* @return
*/
public TUser get(String productNo){
return get(productNo);
}
}
执行顺序
上游调用子类的get()方法,子类方法将参数转成KEY值调用父类的get方法。从而调用loadingCache.get()方法,内部其实是调用getOrLoad方法。缓存中有对应的值则方法,没有则使用CacheLoader的load方法取值,并将得到的值放入缓存中,因此子类必须重写queryKeyDataInfo()方法,执行子类自己个性的逻辑
最后
以上就是冷傲电源为你收集整理的LoadingCache缓存使用(LoadingCache)的全部内容,希望文章能够帮你解决LoadingCache缓存使用(LoadingCache)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复