redis緩存淘汰原理 lru算法?
lru算法?LRU算法的設計原則是:如果一個數(shù)據(jù)最近一段時間沒有被訪問過,那么它在將來就不太可能被訪問。換言之,當有限的空間充滿數(shù)據(jù)時,應該消除最長時間未被訪問的數(shù)據(jù)。執(zhí)行LRU1。使用數(shù)組存儲數(shù)據(jù),
lru算法?
LRU算法的設計原則是:如果一個數(shù)據(jù)最近一段時間沒有被訪問過,那么它在將來就不太可能被訪問。換言之,當有限的空間充滿數(shù)據(jù)時,應該消除最長時間未被訪問的數(shù)據(jù)。
執(zhí)行LRU
1。使用數(shù)組存儲數(shù)據(jù),用訪問時間戳標記每個數(shù)據(jù)項。插入新數(shù)據(jù)項時,首先增加數(shù)組中現(xiàn)有數(shù)據(jù)項的時間戳,將新數(shù)據(jù)項的時間戳設置為0,然后將其插入數(shù)組中。每次訪問數(shù)組中的數(shù)據(jù)項時,所訪問數(shù)據(jù)項的時間戳都設置為0。當數(shù)組空間已滿時,時間戳最大的數(shù)據(jù)項將被刪除。
2. 使用鏈表實現(xiàn),每次插入新數(shù)據(jù)時,將新數(shù)據(jù)插入鏈表的頭部;每次緩存命中時,將數(shù)據(jù)移動到鏈表的頭部(即訪問數(shù)據(jù));然后在鏈表已滿時丟棄鏈表末尾的數(shù)據(jù)。
3. 使用鏈表和HashMap。當需要插入新數(shù)據(jù)項時,如果新數(shù)據(jù)項存在于鏈表中(通常稱為hit),請將節(jié)點移動到鏈表的頭部。如果不存在,則創(chuàng)建一個新節(jié)點并將其放在鏈表的頭部。如果緩存已滿,請刪除鏈表的最后一個節(jié)點。在訪問數(shù)據(jù)時,如果鏈表中存在該數(shù)據(jù)項,則節(jié)點會移到鏈表的頭,否則返回-1。這樣,鏈表末尾的節(jié)點就是最近不可訪問的數(shù)據(jù)項。
對于第一種方法,需要連續(xù)維護數(shù)據(jù)項的訪問時間戳。另外,在插入數(shù)據(jù)、刪除數(shù)據(jù)和訪問數(shù)據(jù)時,時間復雜度為O(n)。對于第二種方法,鏈表的時間復雜度為O(n)。所以一般來說,第三種方法是實現(xiàn)LRU算法。