簡體   English   中英

我應該使用HashTable還是HashMap作為數據緩存?

[英]Should I use HashTable or HashMap as a data cache?

我想在內存中創建一個數據緩存,這樣我就不必每次都查詢數據庫。

字典最初將為空,並且在從中請求數據時將填充該字典。

為此,字典應該是HashTable還是HashMap?

ConcurrentHashMap或synchronizedMap會更好嗎?

為了我的目的,請解釋為什么X比Y好。 我試圖了解它們之間的差異。

//variable for locking purposes.
private String LOCK = new String("LOCK");
//HashMap or HashTable?
private HashMap<Long, Long> dictionary = new HashMap<Long, Long>();

public Long getValue(Long key) throws SQLException{
        Long value = dictionary.get(key);
        if(value != null)
            return value ;
        synchronized (LOCK) {
            //Check again to make sure another thread hasn't populated the dictionary
            key = dictionary.get(key);
            if(key != null)
                return value;
            //Get value  from database
            //store in map for future use
            dictionary.put(key, value);
        }
        return value;
    }

由於我希望多個線程同時讀取數據,因此我沒有同步整個方法。 但是,應該同步將數據插入字典。

我不會存儲空值。

PS有人可以用實例解釋它們之間的差異嗎?

使用ConcurrentHashMap

它提供標准Map接口的高性能並發實現。

為了提供高並發性,實現在內部管理自己的同步。 因此,不可能從中排除並發活動,鎖定它將不起作用,但會減慢程序。

ConcurrentHashMap針對檢索操作進行了優化,例如get ConcurrentHashMap擴展了Map並添加了幾個方法,包括putIfAbsent(key, value) ,如果沒有鍵,則插入鍵的映射並返回與鍵關聯的先前值,如果沒有則返回null 這樣可以輕松實現線程安全的映射。

除了提供出色的並發性外,ConcurrentHashMap非常快。 除非你有令人信服的理由,否則使用ConcurrentHashMap優先於Collections.synchronizedMapHashtable 簡單地用並發映射替換舊式同步映射可以顯着提高並發應用程序的性能。

有關更多信息,我建議閱讀Effective Java

為什么不查看像ehcache( http://ehcache.org/ )這樣的緩存API。 此外,如果您的數據增長到千兆級別,那么您甚至可以與BigMemory鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM