簡體   English   中英

Hashtable的超時機制

[英]Timeout Mechanism for Hashtable

我有一個哈希表,在流量很大的情況下。 我想為哈希表添加超時機制,刪除太舊的記錄。 我擔心的是, - 它應該是輕量級的 - 刪除操作沒有時間關鍵。 我的意思是(超時值是1小時)刪除操作可以在1小時或1小時15分鍾后。 沒有問題。

我的意見是,我創建了一個大數組(作為環形緩沖區),存儲時間和哈希表鍵,當添加到哈希表時,使用數組索引查找數組上的下一個插槽時間,如果數組插槽為空,則插入時間和HT鍵,如果數組槽不為空,則比較發生超時的插入時間。
如果發生超時從Hashtable中刪除(如果尚未刪除)則不會發生超時,增加索引直到找到空槽或定時數組槽。 從哈希表中刪除時,大數組上沒有操作。

不久,對於Hashtable的每個添加操作,可以從哈希表中刪除1個timeouted元素或不執行任何操作。

您的優雅和輕量級解決方案是什么?

謝謝你的幫助,

我的方法是使用Guava MapMaker

ConcurrentMap<String, MyValue> graphs = new MapMaker()
   .maximumSize(100)
   .expireAfterWrite(1, TimeUnit.HOURS)
   .makeComputingMap(
       new Function<String, MyValue>() {
         public MyValue apply(String string) {
           return calculateMyValue(string);
         }
       });

這可能不是正是你所描述的東西,但機會是足夠接近。 而且它更容易生產(加上它使用經過充分測試的代碼庫)。

請注意,您可以通過在make*()調用之前調用不同的方法來調整生成的Map的行為。

您應該考慮使用LinkedHashMapWeakHashMap

前者有一個構造函數,用於將元素的迭代順序設置為上次訪問的順序; 這使刪除太舊的元素變得微不足道。 並且可以重寫其removeEldestEntry方法,以定義自己的策略,以便在插入新條目后自動刪除最長條目。

后者使用對密鑰的弱引用,因此任何沒有其他引用的密鑰都可以自動進行垃圾回收。

我認為更簡單的解決方案是使用Apache Commons Collections中的 LRUMap 當然,如果您喜歡或想要學習,您可以編寫自己的數據結構,但這個問題非常普遍,因此存在大量現成的解決方案。 (我相信其他人也會指出你的其他實現,經過一段時間你的問題將從他們中選擇正確的:) :)

假設您的緩存結構中當前訪問量最大的項目占據了極少數,您可能會隨機選擇要刪除的項目(刪除非常有用的內容的可能性很小)。 我已經使用過這種技術,並且在這個特定的應用程序中,它運行得非常好,並且接下來沒有實施工作。

暫無
暫無

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

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