首页 > 代码库 > ehcache object key的实现原理
ehcache object key的实现原理
这几天为了设计缓存机制,查阅了很多缓存方面的资料,作为没有实战经验的小白自然被各种性能报告、内存机制、集群方式搞得一头雾水。但查了这些资料后,对各个cache的特点有了感性的了解。
ehcache是最后调研的cache,他有个明显不同的地方:缓存中的键和值都可以是object类型的对象。只可以是object这较好接受,大概是对象的序列化支持的,而ehcache本身是纯java实现,这是它得天独厚的优势。但是一object作为键就让人不解了,毕竟存入对象时与取出对象时作为键的对象肯定是两个不同的引用。那么ehcache一定有一些方法鉴别出对象内容的异同。那它是怎么做到的呢?
答案是hashCode
ehcache的put方法(之一)如下:
public final Element get(Object key) throws IllegalStateException, CacheException { checkStatus(); if (disabled) { return null; } if (isStatisticsEnabled()) { long start = System.currentTimeMillis(); Element element = searchInStoreWithStats(key); //todo is this expensive. Maybe ditch. long end = System.currentTimeMillis(); liveCacheStatisticsData.addGetTimeMillis(end - start); return element; } else { return searchInStoreWithoutStats(key, false, true); } }其中Elememt是键值对对象,Element的构造方法有好多重构,有个关键的方法:
public Element(final Serializable key, final Serializable value, final long version) { this((Object) key, (Object) value, version); }
跟进代码中判断key值是否存在的方法可以看到:
public boolean containsKey(Object key) { int hash = hash(key.hashCode()); return segmentFor(hash).containsKey(key, hash); }最终ehcache会调用hashCode()方法,对象的比较变成了hash的比较。
通常java中的hashCode()是一个java 原生的native方法,它只保证在一个程序的一次运行期间对两个equal()方法相等的对象要有相同的hash值,其他不作要求。所以我们如果想用自己定义的类作为key,那么就需要自己实现hashCode方法,保证我们关心的属性都考虑在内,并且这个类还需要继承Serializable方法以声明其可以序列化。所以ehcache中用对象作为键时不必担心对象的大小会影响内存的使用效率。
在百度上没有搜到关于这个问题的帖子,google才出来的,现在上个google太难了,有好办法的朋友分享一下!造福码农!
相关问题链接:http://stackoverflow.com/questions/5908619/ehcache-key-type
ehcache object key的实现原理
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。