色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

淺談Java如何實現一個基于LRU時間復雜度為O(1)的緩存

瀏覽:5日期:2022-08-27 15:14:09

LRU:Least Recently Used最近最少使用,當緩存容量不足時,先淘汰最近最少使用的數據。就像JVM垃圾回收一樣,希望將存活的對象移動到內存的一端,然后清除其余空間。

緩存基本操作就是讀、寫、淘汰刪除。

讀操作時間復雜度為O(1)的那就是hash操作了,可以使用HashMap索引 key。

寫操作時間復雜度為O(1),使用鏈表結構,在鏈表的一端插入節點,是可以完成O(1)操作,但是為了配合讀,還要再次將節點放入HashMap中,put操作最優是O(1),最差是O(n)。

不少童鞋就有疑問了,寫入時又使用map進行了put操作,為何緩存不直接使用map?沒錯,首先使用map存儲了節點數據就是采用空間換時間,但是淘汰刪除不好處理,使用map如何去記錄最近最少使用(涉及到時間、頻次問題)。so,使用鏈表可以將活躍節點移動到鏈表的一端,淘汰時直接從另一端進行刪除。

public class LruCache<K,V> {/** 這里簡單點直接初始化了*/ private int capacity = 2; private int size = 0; private HashMap<K,DoubleListNode<K,V>> cache = new HashMap<>(capacity); private DoubleListNode<K,V> lruNode = new DoubleListNode<K, V>(null,null,null,null); private DoubleListNode<K,V> mruNode = new DoubleListNode<K, V>(null,null,null,null); public V get(K key){ DoubleListNode<K,V> target = cache.get(key); if (target == null) { return null; } /** 使用過就移動到右側 */ move2mru(target); return target.value; } public void put(K key,V value){ if(cache.containsKey(key)){ DoubleListNode<K,V> temp = cache.get(key); temp.value = value; /** 使用過就移動到右側 */ move2mru(temp); return; }/** 容量滿了清除左側 */ if(size >= capacity){ evict4lru(); } DoubleListNode<K,V> newNode = new DoubleListNode<>(mruNode,null,key,value); if(size == 0){ lruNode.next = newNode; } mruNode.next = newNode; mruNode = newNode; cache.put(key,newNode); size++; } private void move2mru(DoubleListNode<K,V> newMru){ DoubleListNode<K,V> pre = newMru.pre; DoubleListNode<K,V> next = newMru.next; pre.next = next; newMru.pre = mruNode; mruNode.next = newMru; mruNode = newMru; } private void evict4lru(){ cache.remove(lruNode.next.key); lruNode.next = lruNode.next.next; size--; } public String toString(){ StringBuffer sb = new StringBuffer('lru -> '); DoubleListNode<K,V> temp = lruNode; while(temp!=null){ sb.append(temp.key).append(':').append(temp.value); sb.append(' -> '); temp = temp.next; } sb.append(' -> mru '); return sb.toString(); } public static void main(String[] args) { LruCache<String,String> cache = new LruCache<>(); cache.put('1','1'); System.out.println(cache); cache.get('1'); cache.put('2','2'); System.out.println(cache); cache.put('3','3'); System.out.println(cache); cache.put('4','4'); System.out.println(cache); }}class DoubleListNode<K,V>{ K key; V value; DoubleListNode<K,V> pre; DoubleListNode<K,V> next; public DoubleListNode(K key,V value){ this.key = key; this.value = value; } public DoubleListNode(DoubleListNode<K,V> pre,DoubleListNode<K,V> next,K key,V value){ this.pre = pre; this.next = next; this.key = key; this.value = value; }}

這里使用鏈表,及HashMap完成了基于LRU的緩存,其中HashMap主要用來快速索引key,鏈表用來完成LRU機制。當然尚有許多不足,包括緩存移除remove,緩存ttl,線程安全等。

到此這篇關于淺談Java如何實現一個基于LRU時間復雜度為O(1)的緩存的文章就介紹到這了,更多相關Java基于LRU時間復雜度為O(1)的緩存內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
主站蜘蛛池模板: 成人亚州| 国产成人精品视频播放 | 国产成人精品三级91在线影院 | 色婷婷国产精品欧美毛片 | 国产成人精品综合 | 万全影院亚洲影院理论片 | 国产在线视频一区二区三区 | 在线久草 | 久久亚洲精品tv | 九九九国产在线 | 日本精品1在线区 | 久草在线视频免费资源观看 | 男人天堂国产 | 国内自拍一区 | 99在线国产| 欧美激情一级欧美精品 | 一级毛片免费播放视频 | 92自拍视频 | 综合久久久久久久 | www.日本免费 | 三级国产在线观看 | 欧美性精品hd在线观看 | 大黄一级片 | 美女网站免费观看视频 | 国产成人免费永久播放视频平台 | 一区精品麻豆经典 | 国产精品久久久一区二区三区 | 欧美国产三级 | 亚洲精品99久久一区二区三区 | 永久免费毛片手机版在线看 | 全部在线美女网站免费观看 | 美女一级片视频 | 免费欧洲毛片a级视频无风险 | 国产高清厕所盗摄视频 | 全部aⅴ极品视觉盛宴精品 全部免费a级毛片 | 亚洲国产毛片aaaaa无费看 | 手机看片1024精品日韩 | 精品视频久久久久 | 青青操在线视频 | 亚洲男人天堂av | 美女把张开腿男生猛戳免费视频 |