2013-10-08 164 views
2

從我的理解緩存是將數據存儲在方便的位置,以便快速訪問。緩存的每個實現(例如:LinkedHashMap,MemcacheD)都是鍵值存儲。這是有道理的,我同意。但我的問題是默認緩存也暗示一個鍵值?換句話說,不會將對象的數組列表視爲緩存?換句話說,如果在實現LRU緩存的同時需要數據是一個Entry<key, value>對象?緩存是否需要鍵值對?

我在3個不同的問題解釋,以防止需要提供更多的等等解釋/數據不全的問題

回答

2

換句話說不會被認爲是緩存的對象的arraylist?

是的,您可以將其用作緩存。數組索引是您的緩存鍵。

數組列表的問題是,您通常無法從索引建議對象。我的意思是,索引通常不是您要映射到的數據的有意義的參考數據。

如果你考慮爲什麼緩存是基於鍵值的,你必須考慮緩存解決的問題。

緩存解決的問題是:

如何訪問一個數據結構,是耗時通過一些簡單的引用數據快速獲取?

因此,您總是有一些數據僅僅是難以獲得的數據結構的參考,例如,客戶編號 - >客戶。這些引用數據稱爲緩存鍵。這是一個簡單的數據結構,具有足夠的信息來創建或獲取更復雜的數據結構。所以它只是一個映射,因此緩存通常是由地圖數據結構實現的。

回到最初的問題

換句話說

慣於對象的ArrayList被認爲是緩存?

我們現在可以理解,使用數組意味着您的引用數據只是一個整數。所以數組列表緩存通常會被很多未使用的空間碎片化。考慮客戶號碼。 - >客戶的例子。在這個例子中,數組列表的大小必須至少是最大的客戶編號。這是緩存,並增長,如果一個新的客戶與更大的客戶號碼。應該被緩存。

如果我們想優化這個,我們必須找到一種方法來將完整的整數範圍映射到一個非常小的範圍。但如果我們這樣做,可能會有兩個客戶號碼。被映射到相同的索引。因此我們會發生碰撞。爲了處理這個問題,我們必須引入一個列表或某種鏈接的數據結構來保存具有相同值的所有對象。

這就是HashMap的工作原理。

0

我想,這是不是使用特定的策略,它的所有緩存的目標。

什麼是從緩存預期 - 一個很好的指針可以是http://commons.apache.org/proper/commons-jcs/

鍵值對容易與許多流行的算法(包括Apache之一)配合來實現高速緩存,因此成爲一個自然的候選。

但是,我認爲使用任何其他算法都沒有問題,這可能不是基於鍵值對。在這種情況下,您可能需要從頭開始編寫新的高速緩存方案實現。