`

Java Cache 的HashMap实现, 适用场景及分布式ehcache实例

阅读更多

 

cache是老生常谈的事情,这里我想强调一下KISS原则,就是keep it simple and stupid。最近看到很多场景下cache使用的不适当,特别是被过度使用了。一个简单键值存储并不需要复杂的cache方案,好的方案就是用最简单的方法解决问题。简洁是美!

 

一个标准Cache的主要特征是:

过期时间       

容量规划(重要)

清除策略(重要)

命中率统计 

 

基于以上特征,使用HashMap作为本地cache似乎很不适当。更重要的是,有不少朋友认为HashMap可能会使内存耗尽。其实不然,自jdk1.2后,Java就引入了WeakHashMap。看看api文档是怎么说的:对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。丢弃某个键时,其条目从映射中有效地移除,因此,该类的行为与其他的 Map 实现有所不同。

 

这个翻译明显有点烂,总结一下,和强引用的HashMap相比,WeakHashMap在本身引用不被回收的前提下允许GC回收它的键值对。当GC发现内存即将耗尽且没有其他对象可以释放时,会主动回收WeakHashMap所占用的对象。因此使用WeakHashMap作为本地cache是不会造成内存耗尽。如果你仅仅需要一个简单的键值对存储,而并不关心命中率统计,那么放心的使用WeakHashMap作为cache吧。

 

通过简单的包装,就可以为你的HashMap增加过期时间和容量规划。而且比其他cache更高效。openfire的DefaultCache就是一个很好的例子:http://svn.igniterealtime.org/svn/repos/openfire/trunk/src/java/org/jivesoftware/util/cache/DefaultCache.java

 

DefaultCache的核心是HashMap,另外增加了一层很薄的包装来实现过期和LRU。DefaultCache包括两个LinkedList,一个用于存储插入顺序,另一个用于存储插入时间。当添加cache时,都addFirst。当cache size达到临界值时,从最尾部删除。有朋友测试过,比ehcache快5倍。

 

如果本地cache不能满足你的要求,ehcache是个很好的选择。不仅仅作为分布式的cache,甚至作为状态同步,ehcache都有非常优秀的案例。也可以实现多机copy。分享一个数据,某生产系统中ehcache每天处理17,466,415次replication。

 

基于ehcache的分布式缓存,你可以简单的实现分布式计算。分析一个场景,某ios后端服务要求用户先注册ios设备,可以按下图处理设备信息。DeviceServer接受device注册后同步copy的本地cache和ehcache。该ehcache按以下方式配置成对。本地cache再定期(每隔几秒钟)从ehcache中加载peer server注册的数据。

 

 

ehcache.xml 写道
<cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=manual,
rmiUrls=//192.168.0.1:20121/testCache"/>

<cacheManagerPeerListenerFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
properties="hostName=192.168.0.2,port=20121,socketTimeoutMillis=60000"/>

<cache name="testCache"
maxElementsInMemory="20000"
eternal="false"
overflowToDisk="false"
memoryStoreEvictionPolicy="LRU">
<cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
properties="replicateAsynchronously=true,
replicatePuts=true,
replicateUpdates=true,
replicateUpdatesViaCopy=true,
asynchronousReplicationIntervalMillis=2000"
/>
</cache>
 

peer server的hostName和rmiUrls配置需要做相应改动。

 

伪代码如下

 

 

init() {
	cacheManager = new net.sf.ehcache.CacheManager(ThisClass.class.getResource("/ehcache.xml"));
	testCache = cacheManager.getCache("testCache");
}

sync() {
	while(true) {
		List keys = testCache.getKeysNoDuplicateCheck();

		for (int i = 0; i < keys.size(); i++) {
			net.sf.ehcache.Element element = testCache.get(keys.get(i));
			MyObj changed = (MyObj) element.getValue();
			// do magic

			testCache.remove(keys.get(i), true);
		}
	}
}
 

 

根据KISS原则,建议简单状态同步都使用ehcache完成。知识投入低,且易于维护。

  • 大小: 21.4 KB
0
0
分享到:
评论

相关推荐

    Java中用hashmap实现购物车

    Java语言使用hashmap实现向购物车添加删除修改商品,显示商品信息

    基于HashMap的用户标签处理兼Java中HashMap实现原理研究.pdf

    "基于HashMap的用户标签处理兼Java中HashMap实现原理研究" 本文研究了基于HashMap的用户标签处理方法,并对Java中HashMap的实现原理进行了深入研究。HashMap是一种高效的数据结构,可以快速地存储和检索数据。本文...

    自定义map实现java的hashmap

    在Java编程中,HashMap是一个非常重要的数据结构,它实现了Map接口,提供了键值对的存储功能,具有快速存取和高效查找的特点。HashMap基于哈希表(也称为散列表)原理,通过键对象的哈希码来定位元素,进而实现O(1)...

    Java中HashMap的工作机制

    在Java中,HashMap是一种广泛使用的数据结构,它基于哈希表的Map接口实现。哈希表是一种通过哈希过程将键映射到特定位置的数据结构,该位置存储了键对应的值。在详细探讨Java中HashMap的工作机制之前,首先需要理解...

    Java SE程序 HashMap类

    Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序...

    java中HashMap详解.pdf

    Java中的HashMap是一种基于散列机制的Map接口的实现,它允许我们存储键值对。键是唯一的,而值可以重复。HashMap在处理数据时非常高效,因为其操作的时间复杂度接近于O(1)。这是通过使用散列函数将键映射到相应的...

    js 版 java hashmap

    JavaScript中的HashMap并不是内置的数据结构,但在许多开发场景中,我们需要实现类似Java中HashMap的功能,用于存储键值对数据。在JavaScript中,我们通常使用对象(Object)来模拟HashMap的行为,因为对象的属性名...

    Java cache 实现

    Java Cache 实现的知识点总结 Java cache 实现是指在 Java 项目中使用缓存机制来存储数据,以提高应用程序的性能和效率。在这里,我们使用 Java 实现了一个简单的缓存系统,使用 HashMap 来存储缓存数据,并提供了...

    java中HashMap,LinkedHashMap,TreeMap,HashTable的区别

    - **HashMap**:适用于大多数场景,特别是不需要排序和线程安全的情况下。 - **LinkedHashMap**:当需要保留元素插入顺序时,是很好的选择。 - **TreeMap**:适合需要对键进行排序的情况。 - **HashTable**:虽然...

    扩展spring boot cache实现redis一二级分布式缓存

    在Spring Boot应用中,缓存是提升性能的关键技术之一,特别是在高并发场景下。本篇文章将探讨如何扩展Spring Boot的缓存功能,实现基于Redis的一级和二级分布式缓存。Redis是一个高性能的键值存储系统,常用于实现...

    Java使用HashMap实现并查集

    Java使用HashMap实现并查集的应用场景: 1. 并查集广泛应用于信息学的国际国内赛题中,例如:Union Find问题、Segment Tree问题等。 2. 并查集也可以应用于解决一些实际问题,例如:社交网络中的社区发现、图像分割...

    java Map实现的cache manager,定时清除缓存里面的值

    java Map实现的cache manager,定时清除缓存里面的值,使数据一致保持最新

    hashmap实现原理

    哈希映射(HashMap)是Java编程语言中广泛使用的数据结构之一,主要提供键值对的存储和查找功能。HashMap的实现基于哈希表的概念,它通过计算对象的哈希码来快速定位数据,从而实现了O(1)的平均时间复杂度。在深入...

    Java HashMap类详解

    本资源详细介绍了 Java 中的 HashMap 类,包括其实现机制、Hash 存储机制、集合存储机制等方面的知识点。 1. HashMap 和 HashSet 的关系 HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员,虽然...

    java cache 简单应用

    3. **Ehcache**:Ehcache是一款广泛使用的开源Java缓存解决方案,支持内存和磁盘存储,具有线程安全、分布式缓存等功能。它可以与Spring框架无缝集成,非常适合大型项目。 4. **JCache (JSR-107)**:Java Caching ...

    java实现cache小实例

    下面是一个简单的Java缓存实现,使用HashMap作为基础存储结构,并实现了LRU淘汰策略: ```java import java.util.HashMap; import java.util.Map; public class SimpleCache, V&gt; { private final int capacity; ...

    java HashMap原理分析

    5. Java中HashMap的应用和实现 详细解释: 1. 哈希函数的原理和应用 哈希函数是一种将输入数据转换为固定长度的哈希码的函数。在HashMap中,哈希函数用于将Key转换为一个哈希码,然后根据哈希码将Key-Value对存储...

    Java8HashMap键与Comparable接口编程开

    在Java编程中,HashMap是Java集合框架中的一个重要成员,它提供了高效的存储和检索对象的机制。在Java 8中,HashMap有一些重要的优化和改进,尤其是对于键(Key)的处理方式。这里我们将深入探讨Java 8 HashMap如何...

    Java8 HashMap的实现原理分析

    Java8之后新增挺多新东西,接下来通过本文给大家介绍Java8 HashMap的实现原理分析,对java8 hashmap实现原理相关知识感兴趣的朋友一起学习吧

    hashmap 实例

    HashMap 是 Java 中常用的一种数据结构,属于 Java.util 包下的类,它是基于哈希表实现的。在本文中,我们将深入理解 HashMap 的实例及其工作原理,并与其他数据结构如 Vector、ArrayList、LinkedList 和 Hashtable ...

Global site tag (gtag.js) - Google Analytics