缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例。
这样做可以减少系统开销,提高系统效率。
缓存主要可分为二大类:
一、通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上,不管你是以XML格式,序列化文件DAT格式还是其它文件格式;
二、内存缓存,也就是实现一个类中静态Map,对这个Map进行常规的增删查.
接下来说的是 内存缓存 (基于cache)
package cn.huimin.account.base.cache;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import cn.huimin.common.constants.ErrorConstants;
import cn.huimin.common.constants.MicroServiceConstants;
import cn.huimin.common.util.httpclient.http.HttpPostRequest;
import cn.huimin.common.util.httpclient.http.RestClient;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class BranchCache{
//生命静态map集合 用于放置内存缓存信息
public static Map<String,String> branchCache = new HashMap<String, String>();
public static Logger LOGGER=Logger.getLogger(BranchCache.class);
private static String HEAD_OFFICE = "1";// 总公司的id
/** 根据id获得name */
public static String get(String key) {
checkEmptyAndLoad();
if(StringUtils.isNotEmpty(key)) {
if(LOGGER.isDebugEnabled()) {
LOGGER.info("从缓存中提取数据 Key:"+ key +" = data:" + branchCache.get(key).toString());
}
return branchCache.get(key);
}
return null;
}
// 当每次需要在缓存中取数据的时候 ,缓存要先查看缓存map中是不是有
/** 检查集合是否为空,如果为空则加载数据 */
public static void checkEmptyAndLoad() {
if (branchCache.size() == 0) {
synchronized (BranchCache.class) {//Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,
//能够保证在同一时刻最多只有一个线程执行该段代码
if (branchCache.size() == 0) {
LOGGER.info("缓存中无分公司数据,提取字典表数据到缓存开始--------");
getDataToDD();//缓存为空
LOGGER.info("缓存中无分公司数据,提取字典表数据到缓存结束--------");
}
}
}
}
//生命 branchCache 其实就是自己定义的一个map集合 ,不要想的太高大上
// 将数据字典表的数据缓存到内存 缓存为空时执行
public static void getDataToDD() {
LOGGER.info("从微服务接口获得分公司");
String resp=new RestClient().GET(MicroServiceConstants.BRANCHES_URL,null);
Map<String,Object> resultMap=new HashMap<String, Object>();
resultMap=HttpPostRequest.changeDeal(resp, resultMap);//post请求方式 ,这里是用于接口请求
if(ErrorConstants.ERR_000000.equals(resultMap.get("respCode"))){//返回值校验
JSONArray json=JSONArray.fromObject(resultMap.get("content")); //获取返回的json信息
if(json.size()>0){
for(int i=0;i<json.size();i++){
JSONObject job = json.getJSONObject(i); // 遍历 jsonarray 数组,把每一个对象转成 json 对象
branchCache.put(job.get("branchid")+"", job.get("branchname")+"");
}
}
}
}
public static void clear() {
branchCache.clear();
}
/**
* 获取集合数据
*
* @return
*/
public static Map<String, String> getAll() {
checkEmptyAndLoad();
return new HashMap<String, String>(branchCache);
}
/**
* 按分公司id获取分公司信息
*
* @param branchId 这里是根据ID来获取分公司名字
* @return
*/
public static Map<String, String> getBranchById(String branchId) {
checkEmptyAndLoad();
Map<String, String> branchMap = new HashMap<String, String>();
if (HEAD_OFFICE.equals(branchId)) {
branchMap.putAll(branchCache);// 总公司可看到全部分公司信息
} else {
branchMap.put(branchId + "", branchCache.get(branchId));
}
return branchMap;
}
public static void main(String[] args) {
getAll();
}
}
这仅仅是cache的自定义缓存的办法 ,而今 cache用的越来越少 ,redis存储的功能已经达到可以覆盖cache缓存
但是对于小型的项目来说 cache还是比较中肯的 用起来也方便 ,当然大的项目还是推荐使用redis
这里仅仅针对缓存做一个简单的阐述,这样对于初学者来说,更加便于理解什么是缓存,已经存取值