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

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介: import java.util.HashMap;import java.util.LinkedList;/* * 基于Java LinkedList,实现Android大数据缓存策略 * 作者:Zhang Phil * 原文出处:http://blog.csdn.net/zhangphil * * 实现原理:原理的模型认为:在LinkedList的头部元素是最旧的缓存数据,在LinkedList的尾部是最新的缓存数据。

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();
//		}
//	}
}

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
相关文章
|
2月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
2月前
|
安全 数据安全/隐私保护 Android开发
探索Android与iOS的隐私保护策略
在数字时代,智能手机已成为我们生活中不可或缺的一部分,而随之而来的则是对个人隐私和数据安全的日益关注。本文将深入探讨Android与iOS两大操作系统在隐私保护方面的策略和实践,分析它们如何应对日益严峻的隐私挑战,以及用户应如何保护自己的数据安全。通过对比分析,我们将揭示两大系统在隐私保护方面的优势和不足,为用户提供有价值的见解和建议。
|
1月前
|
监控 算法 Java
Java虚拟机(JVM)垃圾回收机制深度剖析与优化策略####
本文作为一篇技术性文章,深入探讨了Java虚拟机(JVM)中垃圾回收的工作原理,详细分析了标记-清除、复制算法、标记-压缩及分代收集等主流垃圾回收算法的特点和适用场景。通过实际案例,展示了不同GC(Garbage Collector)算法在应用中的表现差异,并针对大型应用提出了一系列优化策略,包括选择合适的GC算法、调整堆内存大小、并行与并发GC调优等,旨在帮助开发者更好地理解和优化Java应用的性能。 ####
38 0
|
2月前
|
存储 算法 Java
Java内存管理深度剖析与优化策略####
本文深入探讨了Java虚拟机(JVM)的内存管理机制,重点分析了堆内存的分配策略、垃圾回收算法以及如何通过调优提升应用性能。通过案例驱动的方式,揭示了常见内存泄漏的根源与解决策略,旨在为开发者提供实用的内存管理技巧,确保应用程序既高效又稳定地运行。 ####
|
28天前
|
缓存 API C#
C# 一分钟浅谈:GraphQL 中的缓存策略
本文介绍了在现代 Web 应用中,随着数据复杂度的增加,GraphQL 作为一种更灵活的数据查询语言的重要性,以及如何通过缓存策略优化其性能。文章详细探讨了客户端缓存、网络层缓存和服务器端缓存的实现方法,并提供了 C# 示例代码,帮助开发者理解和应用这些技术。同时,文中还讨论了缓存设计中的常见问题及解决方案,如缓存键设计、缓存失效策略等,旨在提升应用的响应速度和稳定性。
42 13
|
27天前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
|
2月前
|
分布式计算 运维 API
针对MaxCompute经典网络域名下线,Dataphin应对策略的公告
针对MaxCompute经典网络域名下线,Dataphin应对策略的公告
266 7
|
2月前
|
运维 Java 编译器
Java 异常处理:机制、策略与最佳实践
Java异常处理是确保程序稳定运行的关键。本文介绍Java异常处理的机制,包括异常类层次结构、try-catch-finally语句的使用,并探讨常见策略及最佳实践,帮助开发者有效管理错误和异常情况。
102 5
|
30天前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####
|
11天前
|
存储 消息中间件 设计模式
缓存数据一致性策略如何分类?
数据库与缓存数据一致性问题的解决方案主要分为强一致性和最终一致性。强一致性通过分布式锁或分布式事务确保每次写入后数据立即一致,适合高要求场景,但性能开销大。最终一致性允许短暂延迟,常用方案包括Cache-Aside(先更新DB再删缓存)、Read/Write-Through(读写穿透)和Write-Behind(异步写入)。延时双删策略通过两次删除缓存确保数据最终一致,适用于复杂业务场景。选择方案需根据系统复杂度和一致性要求权衡。
41 0