`
a7683
  • 浏览: 4601 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类

自己实现的一个很简单的对象缓存器。顺便请教大家一些比较优秀的缓存器实现思路。

阅读更多
前段时间写的ConnectionPool已经可用运行了,现在转向CachePool,偶还是菜鸟所以只是利用了j2se的api简单的实现了一个对象缓存器,顺便希望大家能够说说缓存器的设计思路(暂时不考虑分布式应用)。谢谢大家了!

这是缓存器核心类。
package cc.vicp.eden.cache;

import java.util.*;

public class CachePool {
	private HashMap<Object, Object> pool;
	private LinkedList list;
	private int capacity;
	
	public CachePool(int size) {
		pool = new HashMap<Object, Object>();
		list = new LinkedList<Object>();
		this.capacity = size;
	}
	
	public synchronized Object get(Object key) {
		Object value = pool.get(key);
		if(value != null) {
			list.remove(key);
			list.addFirst(key);
		}
		return value;
	}
	
	public synchronized void put(Object key, Object value) {
		Object obj = null;
		if(pool.size() >= capacity) {
			obj = list.removeLast();
			pool.remove(obj);
		}
		obj = pool.get(key);
		if(! value.equals(obj)) {
			pool.remove(key);
		}
		pool.put(key, value);
		list.remove(key);
		list.addFirst(key);
	}
	
	public synchronized Object remove(Object key) {
		Object value = pool.get(key);
		list.remove(key);
		return value;
	}
	
	public synchronized void clear() {
		pool.clear();
		list.clear();
	}
}
分享到:
评论
4 楼 Arbow 2007-07-09  
其实继承HashMap来做Cache也很简单:)


import java.util.LinkedHashMap;
import java.util.Map;
/**
 * 一个实现LRU算法的Map
 * 
 * @author Arbow
 */
public class LRUMap<K,V> extends LinkedHashMap<K,V>
{
    private static final long serialVersionUID = -4653726313477788815L;

    private final int maxSize;
    
    /**
     * 构造一个指定容量的LRU Map
     * @param maxCapacity 最大容量
     */
    public LRUMap(int maxCapacity)
    {
        super(maxCapacity*4/3 + 1, 0.75f, true);
        this.maxSize = maxCapacity;
    }

    protected boolean removeEldestEntry(Map.Entry<K,V> entry)
    {
        return size() > maxSize;
    }
}

3 楼 wdong 2007-07-09  
你用apache的LRUMap不都解决了吗
2 楼 i_love_sc 2007-07-09  
看了之后有点收获啊。以前去看了一下ehcache的文档,看不懂。看了楼主的“超简易”实现稍微懂了一点基本的思想。就是最长时间没有用的最有可能被移出。
1 楼 a7683 2007-07-09  
这是提供了超时检测的缓存器类。
package cc.vicp.eden.cache;

public class CacheManager extends CachePool {
	
	private static final int CAPACITY;
	
	static {
		CAPACITY = 10;
	}
	
	public CacheManager() {
		super(CacheManager.CAPACITY);
	}
	
	@Override
	public synchronized Object get(Object key) {
		Object value = super.get(key);
		if(value instanceof Expireable) {
			Expireable e = (Expireable) value;
			if(e.expire()) {
				remove(key);
				value = null;
			}
		}
		return value;
	}
}

interface Expireable {
	boolean expire();
}

相关推荐

    Asp.net Core 3.1基于AspectCore实现AOP实现事务、缓存拦截器功能

    给一个方法加一个缓存特性,那这个方法就会进行缓存。 这个也是网上说的面向切面编程AOP。 AOP的概念也很好理解,跟中间件差不多,说白了,就是我可以任意地在方法的前面或后面添加代码,这很适合用于缓存、日志等...

    自己实现一个内存缓存

    自己实现一个内存缓存涉及到许多关键点,包括数据结构的选择、缓存淘汰策略、线程安全以及内存管理等。下面将详细讨论这些知识点。 首先,我们要考虑数据结构的选择。在内存缓存中,最常见的数据结构是哈希表(Hash...

    android缓存的简单实现

    在Android应用开发中,缓存技术是至关重要的,它能够提高应用性能,减少网络请求,提升用户体验。...通过分析提供的资源文件,开发者可以更好地理解和学习这一过程,从而在自己的项目中实现高效的缓存管理。

    spring简单的缓存

    参考链接提供的CSDN博客文章《[Spring简单缓存实现](http://blog.csdn.net/maoyeqiu/article/details/50238035)》中,作者详细介绍了如何在Spring项目中实现缓存,包括配置、注解使用以及注意事项,是一个很好的学习...

    redis页面缓存html使用redis实现页面缓存.docx

    本文档主要介绍了使用 Redis 实现页面缓存的方法,包括缓存 key 的设计、缓存实现的思路和代码实现。 页面缓存的目的:页面缓存的主要目的是为了提高网站的访问速度和用户体验。通过将页面缓存到 Redis 中,可以...

    对象缓存池AS3实现

    接下来,我们将探讨如何用AS3实现对象缓存池。首先,我们需要定义一个基类或接口,作为池中对象的模板。这个基类通常会包含一些通用的方法和属性,使得所有池中的对象具有相同的结构。然后,我们可以创建一个专门的...

    PHP实现的简单缓存类.zip

    通过这个简单的缓存类,开发者可以轻松地在自己的PHP应用程序中实现缓存功能,无需依赖第三方库。然而,值得注意的是,虽然这样的实现对于小型项目可能是足够的,但在高并发或大规模应用中,可能需要更强大且性能...

    分布式缓存 原理 架构及Go语言实现-高清-完整目录

    分布式缓存作为一种在多节点之间共享和分布数据的存储方式,是现代大型分布式系统中不可或缺的一个组件。它能够有效降低数据库的读写压力,加速数据访问速度,提高系统的响应性能。在分布式缓存的实现方式中,基于...

    对象缓存

    对象缓存

    Java对象缓存系统的实现,实现了LRU算法,并可以进行集群同步

    Java对象缓存系统的实现涉及到了内存管理、数据结构以及分布式通信等多个领域。本项目实现了LRU(Least Recently Used)算法,这是一种常用的页面替换策略,用于决定在内存空间有限的情况下,哪些对象应该被移出缓存...

    java map 实现缓存技术

    总的来说,Java Map提供了一种简单而有效的方式实现缓存技术。开发者可以根据具体需求选择合适的Map实现,并结合各种策略来管理和维护缓存,以提升系统的响应速度和效率。在实际应用中,还可以考虑使用第三方库如...

    Java利用ConcurrentHashMap实现本地缓存demo

    Java利用ConcurrentHashMap实现本地缓存demo; 基本功能有缓存有效期、缓存最大数、缓存存入记录、清理线程、过期算法删除缓存、LRU算法删除、获取缓存值等功能。 复制到本地项目的时候,记得改包路径哦~

    Ehcache 整合Spring 使用页面、对象缓存

    Ehcache 是一款广泛使用的开源Java缓存解决方案,它可以用于存储页面、对象和数据,以提升应用程序的性能和响应速度。Ehcache 提供了内存和磁盘存储的支持,并且包含多种淘汰策略,如LRU(Least Recently Used)、...

    Android app缓存清理实现

    本文将深入探讨如何实现Android app的缓存清理,并基于提供的"CacheClear"压缩包文件,讲解如何封装一个获取和清理缓存的工具类。 首先,了解Android缓存的作用。缓存是为了提高数据读取速度,将常用但加载较慢的...

    Spring 与Ehcache实现基于方法的缓存

    例如,可以自定义一个基于方法参数和返回值的键生成器,确保缓存键的唯一性。 5. **测试与监控** 使用`TestCache`类进行测试,确保缓存逻辑正确工作。同时,可以使用Ehcache提供的管理工具或监控界面,实时查看...

    高速缓存实现源码

    本项目通过源码实现了一个简单的高速缓存,展示了其在多线程并发环境下的性能优势。 在Java中,高速缓存的实现通常依赖于数据结构如哈希表(HashMap)或并发容器如ConcurrentHashMap。哈希表提供快速的查找和插入...

    使用google guava 实现定时缓存功能

    在IT行业中,Google Guava库是一个非常强大的工具集,它为Java开发人员提供了一系列实用的集合、缓存、并发和I/O工具。本篇文章将详细探讨如何利用Guava库实现定时缓存功能,以提高应用的性能和效率。 首先,Guava...

    Java 中常用缓存Cache机制的实现

    CacheManager 类是一个简单的缓存管理器,它使用 HashMap 来存储缓存对象。 CacheManager 类提供了多种方法来操作缓存,例如获取缓存对象、设置缓存对象、清除缓存对象等。 1. 获取缓存对象: CacheManager 类提供...

Global site tag (gtag.js) - Google Analytics