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

本文探讨了Cache缓存服务器的工作原理,它通过将高查询频率的数据存储在内存中,显著提升了系统响应速度和效率。了解缓存策略,如LRU、LFU等,以及如何正确配置和调整缓存大小,对于优化系统性能至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例。
这样做可以减少系统开销,提高系统效率。

    缓存主要可分为二大类:
    一、通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上,不管你是以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

这里仅仅针对缓存做一个简单的阐述,这样对于初学者来说,更加便于理解什么是缓存,已经存取值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值