• 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
  • 相关阅读:
    Android 平板模拟器内存修改
    UI设计另类,创意的网站和App 集合(持续更新)
    Android平台根据分辨率计算屏幕尺寸,基于物理尺寸来验证手机和平板应用合并的可行性
    shape和selector的结合使用
    RGB浅谈
    Android开发大牛们的博客地址(持续更新)
    解决ViewPager添加点击监听器无触发的问题
    VC 输出闪烁的字母
    计算机体系结构精要
    Xmanager远程连接Ubuntu,窗口无法输入字母'd'
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7260209.html
Copyright © 2020-2023  润新知