使用PriorityQueue實現LFU和LRU

LFU(Least Frequently Used)算法根據數據的歷史訪問頻率來淘汰數據,其核心思想是「若是數據過去被訪問屢次,那麼未來被訪問的頻率也更高。git

而後我先定義一個緩存對象MyCache,這裏有一個泛型用來存對象,而後有一個useCount記錄被使用次數,接下去是建立時間和最近使用時間。github

使用構造方法來初始化一些值:算法

由於使用了Priorityqueue因此要實現Comparable接口,並且更具useCount來比較緩存

而後咱們就能夠進入下一步操做啦,定義一個PriorityQueue做爲全局變量,這個限制一些最大緩存的數量,還有用一個object用來作同步塊,隊列中若是沒有就加入隊列中,這裏就先不寫set的狀況,分佈式

而後根據優先隊列的特性來刪除哪些不經常使用的元素,由於根據排序,優先隊列會把咱們最想要的數據放在頭部,因此調用poll方法,就能夠實現刪除最少使用的那一個,固然這裏我能夠選擇刪除固定數量的不經常使用數據,或者刪除必定比例的數據,這個使用中能夠用定時器或者分佈式任務來清除緩存。測試

由於考慮哪些數據相等,我這裏重寫了hashCode和equals方法,這裏只是調用緩存對象的比較,可是對於那些沒有重寫的緩存對象T,可能就會有問題啦,因此可能有的設計就會用序列化後的數據。設計

由於PriorityQueue只是作了一次的排序,因此我須要在用戶修改後的數據也要更新順序,因此我想把原來的數據刪了,而後再添加一詞,使用次數加1,最近使用時間也更新啦,只是這裏我遍歷了一邊隊列,效率比較低,只是說這裏先考慮這個最近不經常使用淘汰,實際過程確定是查詢爲主。對象

而後咱們測試下:blog

輸出:排序

 

LRU(Least recently used)算法根據數據的歷史訪問記錄來進行淘汰數據,其核心思想是「若是數據最近被訪問過,那麼未來被訪問的概率也更高」。

那麼我想就是把MyCache裏面的排序根據時間來指定就好了,最近最久遠的排在隊列的前面淘汰掉。

固然這裏只是想用PriorityQueue寫着玩!

未完待續

https://github.com/woshiyexinjie/algorithm-xin

相關文章
相關標籤/搜索