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

但查了这些资料后。对各个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 E: 零起点学算法97——进制转换

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

  2. MongoDB 刷新几次就报错

    官方: MongoDB.Driver 在页面上 速度刷新几次,就会抛错? 为何? Service 层  Autofac

  3. 【JSTL】<c:if test=“”>没有else的解决方法

    后台封装了一个对象 放在model里: model.addAttribute("notice", notice); notice是个对象 然后前台如果没有公告的话,希望显示暂无公告 ...

  4. Dreamweaver 支持Jquery智能提示

    a.下载扩展插件:jQuery_API.mxp b.选择菜单栏:命令->扩展管理,选择刚下载的文件安装 c.重启DW 可以看到

  5. WinCE5.0开发环境的建立

    目前WinCE5.0的开发工具主要有以下几种:Platform Builder5.0.EVC4.0+SP4.Visual Studio2005.其中Platform Builder主要用于定制WinC ...

  6. 2011年排名前七位的Linux操作系统。

    下面列出了2011年排名前七位的Linux操作系统. Ubuntu Ubuntu 是一个由全球化的专业开发团队建造的操作系统.它包含了所有您需要的应用程序:浏览器.Office 套件.多媒体程序.即时 ...

  7. Android ANR优化 2

    在实际情况中,当Android项目的用户量特别大时候,一些细小的问题也会被放大,ANR问题就是一个典型的例子. 一些ANR问题只会发生在用户实际使用的情景,当系统资源比较紧张等一些特殊情况下才会遇到, ...

  8. Hive 内建操作符与函数开发——深入浅出学Hive

    第一部分:关系运算 Hive支持的关系运算符 •常见的关系运算符 •等值比较: = •不等值比较: <> •小于比较: < •小于等于比较: <= •大于比较: > •大 ...

  9. [转]Using the Microsoft Connector for Oracle by Attunity with SQL Server 2008 Integration Services

    本文转自:http://technet.microsoft.com/en-us/library/ee470675(v=sql.100).aspx SQL Server Technical Articl ...

  10. Android权限操作之uses-permission详解

    本文实例讲述了Android权限操作之uses-permission.分享给大家供大家参考,具体如下: 我们在安装Android软件的时候,系统会提示该软件所需要的权限,相对于其他系统,android ...