这几天为了设计缓存机制,查阅了非常多缓存方面的资料,作为没有实战经验的小白自然被各种性能报告、内存机制、集群方式搞得一头雾水。

但查了这些资料后。对各个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的实现原理的更多相关文章

  1. KVC之-(id)valueForKey:(NSString *)key的实现原理与验证

    KVC之-(id)valueForKey:(NSString *)key的实现原理与验证 2.-(id)valueForKey:(NSString *)key的实现原理与验证; #功能:使用一个字符串 ...

  2. NodeJS对象数组Array 根据对象object key的值排序sort

    有个js对象数组 var ary=[{id:1,name:”b”},{id:2,name:”b”}] 需求是根据name 或者 id的值来排序,这里有个风骚的函数. /** * 对数组中的对象,按对象 ...

  3. object.key 对象的键排序 可能出现的问题

    // 09-集成提测工作流var node_list_info09 = { '090101': '客户端集成自测', '090201': '编译配置', '090202': '编译出包', '0903 ...

  4. 虚拟dom?diff算法?key?Vue原理的核心三问?打包教你搞定。

    为什么需要虚拟DOM 先介绍浏览器加载一个HTML文件需要做哪些事,帮助我们理解为什么我们需要虚拟DOM.webkit引擎的处理流程,如下图所示: 所有浏览器的引擎工作流程都差不多,如上图大致分5步: ...

  5. Ehcache(2.9.x) - API Developer Guide, Cache Exception Handlers

    About Exception Handlers By default, most cache operations will propagate a runtime CacheException o ...

  6. jdk源码阅读笔记-HashMap

    文章出处:[noblogs-it技术博客网站]的博客:jdk1.8源码分析 在Java语言中使用的最多的数据结构大概右两种,第一种是数组,比如Array,ArrayList,第二种链表,比如Array ...

  7. jdk1.8源码分析-hashMap

    在Java语言中使用的最多的数据结构大概右两种,第一种是数组,比如Array,ArrayList,第二种链表,比如ArrayLinkedList,基于数组的数据结构特点是查找速度很快,时间复杂度为 O ...

  8. java Map使用Object 做为Key的问题

    近期在看dnsjava 源码的时候,不经意间发现一个自己没有想过的问题: HashMap 如何使用key去查找对应的value的,这个问题很难用语言描述的清楚,那就使用代码来进行说明吧! public ...

  9. javascript系列--Object.assign实现浅拷贝的原理以及实现

    一.前言 之前在前面一篇学习了赋值,浅拷贝和深拷贝.介绍了这三者的相关知识和区别. 传送门:https://www.mwcxs.top/page/592.html 本文会介绍浅拷贝Object.ass ...

随机推荐

  1. Problem D: 指针:调用自定义排序函数sort,对输入的n个数进行从小到大输出。

    #include<stdio.h> int sort(int *p,int n) { int i,j,temp; ;i<n-;i++) for(j=i;j<n;j++) if( ...

  2. Problem A: 零起点学算法91——找出一个数组中出现次数最多的那个元素

    #include<stdio.h> int main() { ],b[]={}; while(scanf("%d",&n)!=EOF) { ;i<n;i+ ...

  3. mongodb安装和配置,遇到问题和解决方法

    自己不知道怎么的,心血来潮想重新来安装和配置一下mongodb,之前自己也是按照别人的来整的,印象不深刻.第二遍安装配置遇到很多问题. 弄了两个多小时,期间遇到很多问题: 遇到的主要问题 1.拒绝访问 ...

  4. Xcode 6.4项目中的常见文件(info.plist)

    Xcode 6.4项目中的常见文件(info.plist) 代码中获取 info.plist[NSBundle mainBundle] infoDictionary]; Bundle display ...

  5. python多线程以及同步队列(转)

    转自:http://www.w3cschool.cc/python/python-multithreading.html 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长 ...

  6. 常用 U-boot命令详解

    转:http://www.360doc.com/content/10/0827/13/496343_49168699.shtml 获取帮助环境变量与相关指令U-boot的使用网络命令Nand Flas ...

  7. [转] Cz/C++中栈空间、堆空间,及内存区域的划分

    kevinGao, 原文地址 一个由C/C++编译的程序占用的内存分为以下几个部分: 1.栈区(stack):又编译器自动分配释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构的栈. 2 ...

  8. Unicode中的BOM

    BOM简述 BOM是byte order mark的缩写,在UTF-16和UTF-32中需要使用BOM来区分字节的顺序,因为我们目前的CPU有两种系列,一种是大端模式,一种是小端模式(我们常用的电脑手 ...

  9. jquery动态添加表单数据

    动态添加用户 实现代码 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html ...

  10. class"org.apache.commons.dbcp.BasicDataSource"not found出错的解决办法

    法1:在项目上右击build path->configure build path..->add library..->MyEclipse Libraries选中Spring 2.0 ...