`

简单的缓存算法

阅读更多

一般的缓存都是以时间为过期条件,最近碰到业务,需要缓存在一个范围内,满了后,用新的替代旧的,这样就固定了缓存的容量,使容量可控;可能类似的缓存框架也有,但我自己写了个简单的程序来实现,以下的是算法测试程序,修改后可作为业务缓存使用;发出来请大家指正:

 

算法实现的业务为:

       根据组名来进行缓存,方便管理,此方法可以在以cacheSize为一个圆上进行缓存和清除
        算法始终清除年龄最老的缓存对象,然后将新的对象存入清除区域,如此循环

CacheInfoCacheTest测试类

 

import java.io.File;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

/**
 * @description CacheInfoCacheTest
 * @author 
 * 
 * @date 2012-9-6
 */
public class CacheInfoCacheTest {
	private static Map cacheInfo = new HashMap();

	public static void setGroup(String key, String groupName, int cacheSize, int clearSize) {
		boolean ifinit = true;
		CacheInfo info = (CacheInfo) cacheInfo.get(groupName);
		if (info == null) {
			//可以先从缓存中获取,如果没有,则证明groupName是第一次缓存
			System.out.println("-----------get cacheInfo from file -------------");
			if (info == null) {
				info = new CacheInfo();
				cacheInfo.put(groupName, info);
				ifinit = false;
			}
		}
		if (cacheSize > 0)
			info.setCacheSize(cacheSize);
		if (clearSize > 0)
			info.setClearSize(clearSize);
		
		int curIndex = info.getCurIndex(); // 当前存入计数
		if(ifinit) curIndex++;
		Map keys = info.getKeys();
		if (keys != null && keys.containsValue(key)) {
			// 如果存在了,则直接覆盖			
			System.out.println("---------add override " + groupName + "--" + key + "--cache");
		} else {
			// 如果不存在
			Integer pos = info.getClearIndex(); // 缓存清除索引
			Integer cacheCounter = info.getCacheCounter();// 缓存剩余计数

			//set(groupName + File.separator + key, serializable);
			System.out.println("---------add " + groupName + "--" + key + "--cache");
			if (keys != null && cacheCounter >= cacheSize) {
				clearSize = clearSize > cacheSize ? cacheSize : clearSize;
				for (int i = 0; i < clearSize; i++) {
					// 如果缓冲池已满,则填出clearSize的缓存					
					System.out.println("---------remove clearSize cache" + pos%cacheSize +
";key="+keys.get(groupName + pos % cacheSize));
					pos++;// 用来保存清除的位置
					cacheCounter--; // 用来计数缓存是否已满
				}
				info.setClearIndex(pos % cacheSize);
			}
			if (keys == null)
				keys = new HashMap();
			cacheCounter++;
			curIndex = curIndex % cacheSize;
			info.setCacheCounter(cacheCounter);
			info.setCurIndex(curIndex);
			keys.put(groupName+curIndex, key);
			info.setKeys(keys);
			System.out.println("put key=["+(groupName+curIndex)+","+key+"]");
			System.out.println("put counter=["+groupName+","+curIndex+"]");
			System.out.println("###################################
#################################");
		}
	}
	
	public static void main(String[] args){
		for(int i=0;i<53;i++){
			setGroup("key_"+i,"group",20,8);
		}
	}
}

 

 CacheInfo类:

 

package com.study.cache;

import java.util.Map;

/**
 * @description CacheInfo
 * @author 
 * 
 * @date 2012-9-6
 */
public class CacheInfo implements java.io.Serializable{
	private int cacheSize=20;// 初始缓存容量
	private int clearSize=8;// 缓存满了以后,需要清除的容量
	private Map keys;
	private String group;
	private int curIndex;  //当前存入索引值
	private int clearIndex;//缓存清除索引值
	private int cacheCounter;//缓存剩余计数
	
	public int getCacheSize() {
		return cacheSize;
	}
	public void setCacheSize(int cacheSize) {
		this.cacheSize = cacheSize;
	}
	public int getClearSize() {
		return clearSize;
	}
	public void setClearSize(int clearSize) {
		this.clearSize = clearSize;
	}
	public Map getKeys() {
		return keys;
	}
	public void setKeys(Map keys) {
		this.keys = keys;
	}
	public String getGroup() {
		return group;
	}
	public void setGroup(String group) {
		this.group = group;
	}
	public int getCurIndex() {
		return curIndex;
	}
	public void setCurIndex(int curIndex) {
		this.curIndex = curIndex;
	}
	public int getClearIndex() {
		return clearIndex;
	}
	public void setClearIndex(int clearIndex) {
		this.clearIndex = clearIndex;
	}
	public int getCacheCounter() {
		return cacheCounter;
	}
	public void setCacheCounter(int cacheCounter) {
		this.cacheCounter = cacheCounter;
	}
}

 

  运行结果:

-----------get cacheInfo from file -------------
---------add group--key_0--cache
put key=[group0,key_0]
put counter=[group,0]
####################################################################
---------add group--key_1--cache
put key=[group1,key_1]
put counter=[group,1]
####################################################################
---------add group--key_2--cache
put key=[group2,key_2]
put counter=[group,2]
####################################################################
---------add group--key_3--cache
put key=[group3,key_3]
put counter=[group,3]
####################################################################
---------add group--key_4--cache
put key=[group4,key_4]
put counter=[group,4]
####################################################################
---------add group--key_5--cache
put key=[group5,key_5]
put counter=[group,5]
####################################################################
---------add group--key_6--cache
put key=[group6,key_6]
put counter=[group,6]
####################################################################
---------add group--key_7--cache
put key=[group7,key_7]
put counter=[group,7]
####################################################################
---------add group--key_8--cache
put key=[group8,key_8]
put counter=[group,8]
####################################################################
---------add group--key_9--cache
put key=[group9,key_9]
put counter=[group,9]
####################################################################
---------add group--key_10--cache
put key=[group10,key_10]
put counter=[group,10]
####################################################################
---------add group--key_11--cache
put key=[group11,key_11]
put counter=[group,11]
####################################################################
---------add group--key_12--cache
put key=[group12,key_12]
put counter=[group,12]
####################################################################
---------add group--key_13--cache
put key=[group13,key_13]
put counter=[group,13]
####################################################################
---------add group--key_14--cache
put key=[group14,key_14]
put counter=[group,14]
####################################################################
---------add group--key_15--cache
put key=[group15,key_15]
put counter=[group,15]
####################################################################
---------add group--key_16--cache
put key=[group16,key_16]
put counter=[group,16]
####################################################################
---------add group--key_17--cache
put key=[group17,key_17]
put counter=[group,17]
####################################################################
---------add group--key_18--cache
put key=[group18,key_18]
put counter=[group,18]
####################################################################
---------add group--key_19--cache
put key=[group19,key_19]
put counter=[group,19]
####################################################################
---------add group--key_20--cache
---------remove clearSize cache0;key=key_0
---------remove clearSize cache1;key=key_1
---------remove clearSize cache2;key=key_2
---------remove clearSize cache3;key=key_3
---------remove clearSize cache4;key=key_4
---------remove clearSize cache5;key=key_5
---------remove clearSize cache6;key=key_6
---------remove clearSize cache7;key=key_7
put key=[group0,key_20]
put counter=[group,0]
####################################################################
---------add group--key_21--cache
put key=[group1,key_21]
put counter=[group,1]
####################################################################
---------add group--key_22--cache
put key=[group2,key_22]
put counter=[group,2]
####################################################################
---------add group--key_23--cache
put key=[group3,key_23]
put counter=[group,3]
####################################################################
---------add group--key_24--cache
put key=[group4,key_24]
put counter=[group,4]
####################################################################
---------add group--key_25--cache
put key=[group5,key_25]
put counter=[group,5]
####################################################################
---------add group--key_26--cache
put key=[group6,key_26]
put counter=[group,6]
####################################################################
---------add group--key_27--cache
put key=[group7,key_27]
put counter=[group,7]
####################################################################
---------add group--key_28--cache
---------remove clearSize cache8;key=key_8
---------remove clearSize cache9;key=key_9
---------remove clearSize cache10;key=key_10
---------remove clearSize cache11;key=key_11
---------remove clearSize cache12;key=key_12
---------remove clearSize cache13;key=key_13
---------remove clearSize cache14;key=key_14
---------remove clearSize cache15;key=key_15
put key=[group8,key_28]
put counter=[group,8]
####################################################################
---------add group--key_29--cache
put key=[group9,key_29]
put counter=[group,9]
####################################################################
---------add group--key_30--cache
put key=[group10,key_30]
put counter=[group,10]
####################################################################
---------add group--key_31--cache
put key=[group11,key_31]
put counter=[group,11]
####################################################################
---------add group--key_32--cache
put key=[group12,key_32]
put counter=[group,12]
####################################################################
---------add group--key_33--cache
put key=[group13,key_33]
put counter=[group,13]
####################################################################
---------add group--key_34--cache
put key=[group14,key_34]
put counter=[group,14]
####################################################################
---------add group--key_35--cache
put key=[group15,key_35]
put counter=[group,15]
####################################################################
---------add group--key_36--cache
---------remove clearSize cache16;key=key_16
---------remove clearSize cache17;key=key_17
---------remove clearSize cache18;key=key_18
---------remove clearSize cache19;key=key_19
---------remove clearSize cache0;key=key_20
---------remove clearSize cache1;key=key_21
---------remove clearSize cache2;key=key_22
---------remove clearSize cache3;key=key_23
put key=[group16,key_36]
put counter=[group,16]
####################################################################
---------add group--key_37--cache
put key=[group17,key_37]
put counter=[group,17]
####################################################################
---------add group--key_38--cache
put key=[group18,key_38]
put counter=[group,18]
####################################################################
---------add group--key_39--cache
put key=[group19,key_39]
put counter=[group,19]
####################################################################
---------add group--key_40--cache
put key=[group0,key_40]
put counter=[group,0]
####################################################################
---------add group--key_41--cache
put key=[group1,key_41]
put counter=[group,1]
####################################################################
---------add group--key_42--cache
put key=[group2,key_42]
put counter=[group,2]
####################################################################
---------add group--key_43--cache
put key=[group3,key_43]
put counter=[group,3]
####################################################################
---------add group--key_44--cache
---------remove clearSize cache4;key=key_24
---------remove clearSize cache5;key=key_25
---------remove clearSize cache6;key=key_26
---------remove clearSize cache7;key=key_27
---------remove clearSize cache8;key=key_28
---------remove clearSize cache9;key=key_29
---------remove clearSize cache10;key=key_30
---------remove clearSize cache11;key=key_31
put key=[group4,key_44]
put counter=[group,4]
####################################################################
---------add group--key_45--cache
put key=[group5,key_45]
put counter=[group,5]
####################################################################
---------add group--key_46--cache
put key=[group6,key_46]
put counter=[group,6]
####################################################################
---------add group--key_47--cache
put key=[group7,key_47]
put counter=[group,7]
####################################################################
---------add group--key_48--cache
put key=[group8,key_48]
put counter=[group,8]
####################################################################
---------add group--key_49--cache
put key=[group9,key_49]
put counter=[group,9]
####################################################################
---------add group--key_50--cache
put key=[group10,key_50]
put counter=[group,10]
####################################################################
---------add group--key_51--cache
put key=[group11,key_51]
put counter=[group,11]
####################################################################
---------add group--key_52--cache
---------remove clearSize cache12;key=key_32
---------remove clearSize cache13;key=key_33
---------remove clearSize cache14;key=key_34
---------remove clearSize cache15;key=key_35
---------remove clearSize cache16;key=key_36
---------remove clearSize cache17;key=key_37
---------remove clearSize cache18;key=key_38
---------remove clearSize cache19;key=key_39
put key=[group12,key_52]
put counter=[group,12]
####################################################################

 

 

说明:每满20,则从最先存入的那个对象开始,清除8个对象空间,供新的对象进行缓存;(最先对象是动态变化的),  抛砖引玉,希望有更好的算法!

分享到:
评论

相关推荐

    缓存、缓存算法和缓存框架简介.docx

    本文将深入探讨缓存、缓存算法以及缓存框架。 首先,让我们理解缓存的工作机制。缓存通常是一个数据结构,如哈希表,用于存储频繁访问的数据。在上述描述的面试场景中,Programmer One 使用哈希表实现了一个简单的...

    缓存、缓存算法和缓存框架简介 - 文章 - 伯乐在线.pdf

    文章中提及的面试者programmerone对缓存的理解非常浅显,仅限于知道使用hashtable实现简单的缓存机制,而没有深入了解缓存的工作原理、缓存算法的选择标准和缓存框架的使用。面试官提出的问题主要集中在缓存的基本...

    常用的缓存淘汰算法.pdf

    4. 先进先出算法(FIFO):FIFO缓存算法是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单。但是,FIFO缓存淘汰算法也存在一些缺点,例如只能顺序写入数据,顺序的读出...

    先进先出缓存算法

    先进先出(First In First Out,简称FIFO)缓存算法是一种简单的缓存替换策略,它按照数据进入缓存的时间顺序进行管理,当缓存空间不足时,会移除最先进入缓存的数据,以便为新数据腾出空间。这种算法实现简单,但...

    缓存替换算法研究综述

    缓存技术必须适应这种变化,提出了基于频率和时间平衡策略的算法、基于特殊应用的策略和基于探测的策略等单级缓存算法。 多级缓存的出现使得缓存结构更加复杂,需要特别考虑缓存层次结构带来的性能问题。多级缓存...

    基于老化算法的分布式文件缓存算法.pdf

    【分布式文件缓存算法】 分布式文件缓存是一种优化数据检索性能的技术,特别是在大规模并行处理系统和高查询负载的情况下。随着超级计算机的发展,为了匹配计算能力的扩展,出现了并行文件系统,旨在提升文件存取的...

    缓存淘汰算法之LRU

    缓存淘汰算法之 LRU 缓存淘汰算法是指在计算机系统中,为了提高缓存命中率和减少缓存 pollution 而采用的算法。其中,LRU(Least Recently Used,最近最少使用)算法是一种常用的缓存淘汰算法。 1. LRU 算法原理 ...

    Android图片缓存算法的代码例子

    在Android应用开发中,图片加载和缓存是一个关键性能...以上就是关于"Android图片缓存算法的代码例子"的主要知识点,通过这些技术,我们可以有效地处理Android应用中的图片加载和缓存问题,提升应用的性能和用户体验。

    基于深度学习的视频缓存算法.pdf

    本文将深入探讨基于深度学习的视频缓存算法,并分析现有算法的适用性以及未来可能的发展方向。 视频缓存算法的核心目标在于降低延迟,提高命中率,从而提升用户体验。缓存技术通过在距离用户较近的节点存储最近或最...

    Java实现简单LRU缓存算法

    这里的LRUCache类维护了一个双向链表和一个哈希表,用于实现LRU算法。具体实现细节如下: - get方法:首先在哈希表中查找对应的键值对,如果不存在,则返回-1;如果存在,则将对应的节点从双向链表中删除,并将其...

    实现随机标记算法模拟页缓存

    本程序解决的是:模拟类似计算机主、缓存的存储结构,当用户请求某个页面时,若...本程序采用随机标记算法,即在在线标记算法的基础上,对于替换页面时,采用随机从未标记的缓存项中选出一项进行替换。 代码、文档详尽

    C++实现的LFU缓存算法

    本算法为 C++ 实现的 LFU 缓存算法,数据结构为 2 个哈希表再加上 N 个双链表,实现了 get() 和 put() 两个操作,且所有操作的平均时间复杂度均可以控制在 O(1) 内。

    LFU算法LFU算法LFU算法LFU算法

    LFU(Least Frequently Used)算法是一种常用的页面替换策略或缓存淘汰策略,它的核心思想是:最近最少使用的数据在未来被访问的概率较低,因此应该优先淘汰这些数据。在LFU算法中,不仅考虑了数据的使用频率,还...

    一种针对混合存储系统的高效缓存算法.pdf

    【混合存储系统与缓存算法的重要性】 随着固态硬盘(SSD)技术的发展,混合存储系统成为一种兼顾性能和数据安全的解决方案。混合存储系统通常由内存(RAM)、固态硬盘(SSD)和机械硬盘(HDD)组成,其中SSD以其高速...

    z缓存隐面消除算法

    在计算机图形学领域,"z缓存隐面消除算法",也称为Z-Buffering,是一种广泛用于三维图形渲染中的技术,旨在解决多边形覆盖问题,即确定哪些像素是前景,哪些是背景,从而正确地绘制场景。该算法的核心在于使用一个...

Global site tag (gtag.js) - Google Analytics