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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章