Cache缓存服务器 将查询比较频繁的信息放入缓存当中

来源:互联网 发布:在虚拟机上安装mac os 编辑:程序博客网 时间:2024/05/16 12:10
缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例。这样做可以减少系统开销,提高系统效率。    缓存主要可分为二大类:    一、通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上,不管你是以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
这里仅仅针对缓存做一个简单的阐述,这样对于初学者来说,更加便于理解什么是缓存,已经存取值
原创粉丝点击