基于Java LinkedList,实现Android大数据缓存策略

import java.util.HashMap;
import java.util.LinkedList;

/*
 * 基于Java LinkedList,实现Android大数据缓存策略
 * 作者:Zhang Phil
 * 原文出处:http://blog.csdn.net/zhangphil
 *
 * 实现原理:原理的模型认为:在LinkedList的头部元素是最旧的缓存数据,在LinkedList的尾部是最新的缓存数据。
 * 在一个LinkedList(类型C的链表)维护一个存储堆栈,添加元素时候顺序、依次添加。
 *
 *	原理实现的具体方案:只要调用缓存的get()方法后,立即将此元素从原先在LinkedList的位置更新到LinkedList最后的位置。
 *	比如,原先是:1,2,3,4,5。当get了2后,现在的顺序是:1,3,4,5,2。
 *
 * 	缓存空间满的情况下,则删除最旧的元素(在最头部),以腾出空间。
 * 比如,缓存空间是5,原先缓存已经缓存了5个元素:a,b,c,d,e,
 * 当再次添加元素 f 时候,因为缓存空间是5容不下6个元素,所以删除最头部的元素a,把f追加到最尾部变成: b,c,d,e,f
 *
 * 具体使用:类似于Android的LruCache,对外公开两个通用(通用,意味着可以存Bitmap或者类似的数据)方法供存储和读取使用:
 * 	public void put(String key, Object obj);
 *	public Object get(String key);
 *	即通用的<key,value>存储和读取模型。注意:使用者应保证存储时的key唯一。
 * */

public class CacheBasedOnLinkedList {

	// Capacity默认的缓存容量
	private static int CAPACITY = 30;

	private LinkedList<HashMap<String, Object>> mLinkedList;
	private final String KEY = "key", VALUE = "value";

	public CacheBasedOnLinkedList() {
		init();
	}

	public CacheBasedOnLinkedList(int capacity) {
		CAPACITY = capacity;
		init();
	}

	private void init() {
		mLinkedList = new LinkedList<HashMap<String, Object>>();
	}

	// 动态调整缓存空间大小。
	// 注意!该方法极可能线程不安全。
	public void ensureCapacity(int capacity) {
		if (capacity >= CAPACITY) {
			// 若比原先大,直接赋值即可
			// Capacity = capacity;
		} else {
			// 若新调整的容量比原先还要小,那么一个一个的删掉头部元素直到相等
			while (mLinkedList.size() > capacity) {
				HashMap<String, Object> map = mLinkedList.removeFirst();
				System.out.println("\n删除-> " + map.get(KEY) + ":"
						+ map.get(VALUE));
			}
		}

		CAPACITY = capacity;
		System.out.println("\n重新调整缓存容量为:" + CAPACITY);
	}

	// 把需要缓存的数据以<key,value>键值对的形式存入缓存。
	// 存之前,要检查缓存是否满,满了的话就删除LinkedList第一个元素。
	public void put(String key, Object obj) {
		if (mLinkedList.size() < CAPACITY) {

		} else {
			HashMap<String, Object> map = mLinkedList.removeFirst();
			System.out.println("\n缓存空间已满!删除-> " + map.get(KEY) + ":"
					+ map.get(VALUE));
		}

		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put(KEY, key);
		map.put(VALUE, obj);
		mLinkedList.addLast(map);
		System.out.println("\n缓存-> " + map.get(KEY) + ":" + map.get(VALUE));
	}

	// 根据key读出缓存数据
	// 原理:从头到尾遍历整个链表LinkedList,只要检查到元素中的key和给定的key相同,立即返回。
	// 同时更新该元素在LinkedList中位置:从原先的位置放到最后一个位置。
	public Object get(String key) {
		Object obj = null;
		for (HashMap<String, Object> map : mLinkedList) {
			if (map.get(KEY).equals(key)) {
				System.out.println("读取->" + key + ":" + map.get(VALUE));
				mLinkedList.remove(map);
				mLinkedList.addLast(map);
				return map.get(VALUE);
			}
		}

		return obj;
	}

//	// 仅仅是打印输出现在最新的缓存数据情况。
//	private void out() {
//		System.out.print("最新缓存情况:");
//		for (HashMap<String, Object> map : mLinkedList) {
//			System.out.print(map.get(KEY) + ":" + map.get(VALUE) + ",");
//		}
//	}

//	// 测试
//	public static void main(String[] args) {
//		CacheBasedOnLinkedList cache = new CacheBasedOnLinkedList(2);
//
//		Random rand = new Random();
//
//		for (int i = 0; i < 100; i++) {
//			cache.ensureCapacity(rand.nextInt(100) + 1);
//			cache.put(i + "", i);
//			cache.get(rand.nextInt(100) + "");
//			cache.out();
//		}
//	}
}
时间: 2024-12-26 00:43:37

基于Java LinkedList,实现Android大数据缓存策略的相关文章

CSDN Android客户端开发(二):详解如何基于Java用Jsoup爬虫HTML数据

本文参考链接详细介绍如何使用Jsoup包抓取HTML数据,是一个纯java工程,并将其打包成jar包.希望了解如何用java语言爬虫网页的可以看下. 杂家前文就又介绍用HTTP访问百度主页得到html的string字符串,但html的文本数据如果不经过处理就是个文本字符串没有任何效果的.所谓的浏览器就是负责将文本的html"翻译"成看到的界面.在前文有介绍,这个csdn的客户端app分首页.业界.移动.研发.程序员.云计算五大类.以业界为例,http://news.csdn.net/ 

移动基于Percona XTRADB Cluster的大数据解决方案

移动基于Percona XTRADB Cluster的大数据解决方案          一.移动的去IOE之旅      最近因为"棱镜门"事件的曝光,引起了国家对信息安全问题的注意,各大行业也开展起来去"IOE"的行动.对移动而言, 一方面是对信息安全的担心,另一方面是对降低成本的考量,对开源体系架构的引入也成为一种现实的方案. 在互联网行业,MySQL的使用成为主流,但随着Oracle对Sun的收购,MySQL的控制权落入Oracle手中,对MySQL可能闭源的

MaxCompute,基于Serverless的高可用大数据服务

2019年1月18日,由阿里巴巴MaxCompute开发者社区和阿里云栖社区联合主办的"阿里云栖开发者沙龙大数据技术专场"走近北京联合大学,本次技术沙龙上,阿里巴巴高级技术专家吴永明为大家分享了MaxCompute,基于Serverless的高可用大数据服务,以及MaxCompute低计算成本背后的秘密. 以下内容根据演讲视频以及PPT整理而成. 一.什么是MaxCompute Big Data in Alibaba首先为大家介绍阿里巴巴大数据技术的一些相关背景.正如下图所示,阿里巴巴

Java程序员转行大数据的优势

大数据时代,中国IT环境也将面临重新洗牌,不仅仅是企业,更是程序员们转型可遇而不可求的机遇. 国内大多数大型互联网公司的程序员被称作研发工程师,但实际上国内几乎没有研发项目,只能叫做开发.开发程序员的工作大多是重复性劳动,容易产生疲惫感,薪资在工作2-5年内就达到了一个峰值,再要提升就比较困难,这样就导致了很多程序员最终转行做了其他行业. JAVA的精密,强大,拥有其它语言不可替代的性能和可维护性,早已经是成为最受欢迎的编程语言之一,很多人想进入IT行业,首选的第一门语言就是JAVA.但是,在未

给Java开发者的十个大数据框架和工具

当今IT开发人员面对的最大挑战就是复杂性,硬件越来越复杂,OS越来越复杂,编程语言和API越来越复杂,我们构建的应用也越来越复杂.根据外媒的一项调查报告,中软卓越专家列出了Java程序员在过去12个月内一直使用的一些工具或框架,或许会对你有意义. 先来看看大数据的概念.根据维基百科,大数据是庞大或复杂的数据集的广义术语,因此传统的数据处理程序不足以支持如此庞大的体量. 在许多情况下,使用SQL数据库存储/检索数据都是很好的选择.而现如今的很多情况下,它都不再能满足我们的目的,这一切都取决于用例的

高级Java研发人员在解决大数据问题上的技巧

众所周知, Java 在处理数据量比较大的时候,加载到内存必然会导致内存溢出,而在一些数据处理中我们不得不去处理海量数据,在做数据处理中,我们常见的手段是分解,压缩,并行,临时文件等方法; 例如,我们要将 数据库 (不论是什么数据库)的数据导出到一个文件,一般是Excel或文本格式的CSV;对于Excel来讲,对于POI和JXL的接口,你很多时候没有办法去控制内存什么时候向磁盘写入,很恶心,而且这些API在内存构造的对象大小将比数据原有的大小要大很多倍数,所以你不得不去拆分Excel,还好,PO

有Java基础如何学习大数据?

有没有想过一个问题,计算机编程语言众多,常用的编程语言有Java,Python等,在开始学习大数据之前都会选择学习Java,那Java到底好在哪呢?为什么学大数据之前要先学Java呢? 大数据人才越来越多的受到社会和企业的青睐,很多想要学习大数据的新人在开始的时候都会觉得自己学的就是大数据,但是真的开始学大数据了,反而发现首先开始的是Java的学习,学大数据前为什么要先学Java?大数据和Java其实有着密不可分的关系. 零基础刚接触大数据的学员都知道,学习大数据课程之前,都需要先熟悉掌握一种计

android bitmap的缓存策略

在这篇文章中: lrucache disklrucache 缓存策略对比与总结 不论是android还是ios设备,流量对于用户而言都是宝贵的.在没有wifi的场景下,如果加载批量的图片消耗用户过多流量,被其知晓,又要被念叨一波~ 如何避免消耗过多的流量呢?当程序第一次从网络加载图片后,就将其缓存到移动设备上,这样再次使用这个图片时,就不用再次从网络上下载为用户节省了流量. 目前常用的一种缓存算法是lru(least recently used),它的核心思想是当缓存满了,会优先淘汰近期最少使用

oracle基于3种方法的大数据量插入更新

过程插入更新的3种方法: a.逐条检查插入或更新,同时执行插入或更新 b.逐条merge into(逐条是为了记录过程日志与错误信息) c.基于关联数组的检查插入.更新,通过forall批量sql执行 以下为模拟步骤: 1.创建模拟大表,数据量1亿不分区 create table big_table as SELECT ROWNUM RN,'A' A,'B' B,'C' C,'D' D FROM ( SELECT ROWNUM RN FROM DUAL CONNECT BY ROWNUM <=