缓存学习小结(一)

(Java)缓存的分为文件缓存或磁盘缓存(disc cache)和内存缓存(memory cache)两种;文件缓存就是把数据存储在本地磁盘上,内存缓存通常是一个map.缓存的作用就是把首次从网络的获取数据保存起来,当再次访问的时候可以直接从缓存中获取数据而不是从网络中重新加载。可以减少系统开销,提高响应速度。

单独使用内存缓存和单独使用文件缓存应用的执行流程如下所示:

内存缓存和文件缓存同时使用的情况下的流程图大致如下所示:

需要注意的是,当从网络加载数据的时候用一个线程或者提供一个线程池来完成这个功能是比较好的选择。同时需要注意的是由于获取数据的方法需要返回值,根据上面的流程图可知返回的数据的途径可以模拟一个包含了磁盘缓存和内存缓存的实现方案。

public class CacheDemo {
	private ExecutorService pool = Executors.newFixedThreadPool(6);
	private HashMap<String, SoftReference<Data>> memoryCache;// 内存缓存
	public CacheDemo(int imageSaveCount, Data defaultData) {
		memoryCache = new HashMap<String, SoftReference<Data>>();
	}
	/**
	 * 加载数据
	 * @param saveFolder
	 *            文件缓存的路径
	 * @param dataUrl
	 *            数据的地址
	 * @return
	 */
	Path path = null;
	public Data loadData(String saveFolder, final String dataUrl)
			throws InterruptedException, ExecutionException {
		// 判断缓存中是否有数据
		if (memoryCache.containsKey(dataUrl)) {
			SoftReference<Data> softReference = memoryCache.get(dataUrl);
			if (softReference != null) {
				Data data = softReference.get();
				if (data != null) {
					return data;
				}
			}
		}
		// 判断文件缓存中是否有数据
		String filename = getFileName(dataUrl);// 截取url中的文件名
		final String saveFilepath = saveFolder;// 本地缓存文件的路径
		File savePath = new File(saveFilepath);
		if (!savePath.exists()) {// 如果没有就创建
			savePath.mkdirs();
		} else {
			File file = new File(saveFilepath + File.separator + filename);
			if (file.exists()) {
				// 从本地文件中获取数据
				Data data = getData(file);
				if (data != null)
					return data;
			}
		}
                //如果缓存中没有数据,就开启一个callable从网络中获取数据
                DataCallable dc = new DataCallable(dataUrl, saveFilepath);
		Future future = pool.submit(dc);
		return (Data) future.get();
	}

	/**
	 * 定义一个任务从,线程中返回数据
	 */
	class DataCallable implements Callable {

		private String dataUrl;
		private String saveFilepath;

		DataCallable(String dataUrl, String saveFilepath) {
			this.dataUrl = dataUrl;
			this.saveFilepath = saveFilepath;
		}

		@Override
		public Data call() throws Exception {
			byte[] datas = loadDataFromNet(dataUrl);
			Data data = null;
			if (datas != null) {
				data = new Data(datas);
				SoftReference<Data> soft = new SoftReference<Data>(data);
				// 数据放入内存缓存
				memoryCache.put(dataUrl, soft);
				data = null;
			}
			// 写入文件缓存
			try (FileOutputStream out = new FileOutputStream(new File(
					saveFilepath))) {
				out.write(datas);
			}

			return data;
		}
	}
	public byte[] loadDataFromNet(String url) {
		InputStream inputStream = null;
		// Bitmap bitmap = null;
		try {
			URL m = new URL(url);
			HttpURLConnection hURL = (HttpURLConnection) m.openConnection();
			hURL.setConnectTimeout(5000);
			hURL.setReadTimeout(5000);
			inputStream = (InputStream) hURL.getInputStream();

			int len = inputStream.available();
			byte[] data = new byte[1024 * 15];
			ByteArrayOutputStream bStream = new ByteArrayOutputStream();
			int size = 0;
			while ((len = inputStream.read(data)) != -1) {
				bStream.write(data, 0, len);
				size += len;
			}
			data = bStream.toByteArray();
			bStream.reset();
			return data;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (inputStream != null) {
					inputStream.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return null;
	}

	public static String getFileName(String filePath) {
		return filePath.substring(filePath.lastIndexOf(File.separator) + 1);
	}

	public static Data getData(File file) {
		FileInputStream fis = null;
		Data data = null;
		try {
			if (file.isDirectory()) {
				return null;
			}
			file.setLastModified(System.currentTimeMillis());
			fis = new FileInputStream(file);
			data = new Data();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (OutOfMemoryError e) {
			e.printStackTrace();
		} finally {
			try {
				fis.close();
			} catch (Exception e) {
			}
		}
		return data;
	}
}

缓存学习小结(一),布布扣,bubuko.com

时间: 2024-08-08 13:59:19

缓存学习小结(一)的相关文章

varnish学习小结

大纲 一.Varnish 简介 二.Varnish 特点 三.Varnish 与 Squid 对比 四.Varnish 设计结构 五.Varnish 工作流程 六.Varnish 状态引擎(state engine) 七.安装与配置 Varnish 一.Varnish 简介 Varnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸 Verdens Gang 使用3台Varnish代替了原来的12台Squid,性能比以前更好. Varnish 的作者Poul-Henning Kamp是F

javascript 学习小结 (三) jQuery封装ajax尝试 by FungLeo

javascript 学习小结 (三) jQuery封装ajax尝试 by FungLeo 前言 在JS学习中,对于原生的很多东西我理解得并不透彻.但是使用jQuery来操作DOM,基本上还是非常熟练的.但是对于AJAX数据交互的处理,我不是很理解. 近期团队交给我一个后端全接口提供给我的项目.我要利用这些接口来自己组织前端代码.为了学习,我决定不使用VUE或者其他的前端框架来做.而是只使用jQuery框架,数据的部分全部使用拼接字符串的形式实现. 获取数据,显示数据,提交数据. 在这个项目中(

git学习小结

背景:最近因为工作原因,需要将以前的代码库由bitbucket重新布置在一台服务器上,所以就学习了下git,特此记录下 在167这台机器上搭建apache,用做git server,由于以前apache都已经搭好了,所以这里只配置git server 就可以了,此处贴出配置: 服务器搭好了,来到配置中的root目录,git clone https://[email protected]/XXXX 此时,库和服务器都搭好了,用于新库测试的机器也可以从git server上克隆库了,来,我们来试试从

网络编程学习小结

几种网络编程方式: ISAPI.CGI.WinInet.Winsock 它们之间的差别: 1)  ISAPI主要是开发基于浏览器client与server端程序.效率比CGI方式高,并且也扩展了CGI没有的一些功能.(基于TCP/IP模型中的应用层) 2)  CGI主要是开发基于浏览器client与server端程序.(基于TCP/IP模型中的应用层) 3)  WinInet主要是开发client程序.(基于TCP/IP模型中的应用层) 4)  Winsock主要是基于socket来开发clie

MogileFS学习小结

大纲: 一.关于MogileFS 二.常见分布式文件系统 三.MogileFS基本原理 四.MogileFS的实现 一.关于MogileFS 当下我们处在一个互联网飞速发展的信息社会,在海量并发连接的驱动下每天所产生的数据量必然以几何方式增长,随着信息连接方式日益多样化,数据存储的结构也随着发生了变化.在这样的压力下使得人们不得不重新审视大量数据的存储所带来的挑战,例如:数据采集.数据存储.数据搜索.数据共享.数据传输.数据分析.数据可视化等一系列问题. 传统存储在面对海量数据存储表现出的力不从

201671010130 2016-2017-2 《Java程序设计》第四周学习小结

第四周学习小结 本次实验巩固了上次实验分隔数并求和的题,目前这个题有两种做法,一种是不断对数10求余,余数保存在sum中,然后左移一位,直到余数为零.另一种就是将数字强制转换成一个字符串数组String s=String.valueOf(num),根据方法s.toCharArray()将字符分离出来,据"x"-"0"=x,unicode码值相减即可得x的值. 父类和子类能够看两个交集,super关键字是否能够看做一个子类和超类的接口呢? 在子类中可以增加域.增加方法

TimesTen 应用层数据库缓存学习:12. 管理缓存环境

缓存和复制代理的启停和状态查看 cache agent的作用是将监控Oracle中数据的变化,并更新到TimesTen.因此,对于只读和AWT缓存组,cache agent都是必需的. cache agent的启停 ttisql> call ttcachestart ttisql> call ttcachestop 或者 $ ttadmin -cachestart DSN $ ttadmin -cachestop DSN replication agent的启停 ttisql> call

初识ASP.NET---点滴的积累---ASP.NET学习小结

差不多十多天前学习完了北大青鸟的学习视频,没想到没几天的时间就看完了XML视频和牛腩的Javascript视频.学习完了也该总结总结,理理自己的思路,消化一下自己学习到的东西. 视频中的理论知识并不是很多,以例子驱动学起来也不会他过于乏味.全部的学习内容大概的可以用下图表示. 个人感觉这套视频的体系感不是很强,每一集之间老师的串联并不是做得很好,向我等没有教材的有些小的知识无从知晓.但是不能不说这套视频确很适合初学者学习,老师讲解的也不错,从此我也算是入门. 当然要想进一步的了解ASP.NET并

8086汇编学习小结———实时更新

初学IBM-PC 8086,对INT指令不是很理解.现从网上总计如下: 表:DOS系统功能调INT 21H AH 功能 调用参数 返回参数 00 程序终止(同INT 20H) CS=程序段前缀 01 键盘输入并回显 AL=输入字符 02 显示输出 DL=输出字符 03 异步通迅输入 AL=输入数据 04 异步通迅输出 DL=输出数据 05 打印机输出 DL=输出字符 06 直接控制台I/O DL=FF(输入)DL=字符(输出) AL=输入字符 07 键盘输入(无回显) AL=输入字符 08 键盘