生活随笔
收集整理的這篇文章主要介紹了
手写LRU算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
LRU是redis的緩存過期淘汰策略(Least Recently Used),最近最少使用的一種算法,選擇最久未使用的數據將其淘汰。
redis緩存的淘汰策略有很多:
- novicition:不會驅逐任何key,這樣就會在緩存滿的時候報OOM異常
- allkeys-lru:對所有key使用LRU算法進行刪除
- volatile-lru: 對所有設置了過期時間的key使用LRU算法進行刪除
- allkeys-random: 對所有key隨機刪除
- volatile-random: 對所有設置了過期時間的key隨機刪除
- volatile-ttl:刪除馬上要過期的key
- allkeys-lfu:對所有key使用LFU算法進行刪除
- volatile-lfu: duisuoyoushezhileguoqishijian的key使用LFU算法進行刪除
class LRUCache {
int capacity
;
Map<Integer,Node<Integer,Integer>> map
;
DoubleLinkedList<Integer,Integer> list
;
class Node<K,V>{K key
;V value
;Node<K,V> pre
;Node<K,V> next
;public Node(){pre
=next
=null;}public Node(K key
,V value
){this.key
= key
;this.value
= value
;pre
=next
=null;}
}
class DoubleLinkedList<K,V>{Node<K,V> head
;Node<K,V> tail
;public DoubleLinkedList(){head
= new Node<K,V>();tail
= new Node<K,V>();head
.next
= tail
;tail
.pre
= head
;}public Node<K,V> getLast(){return tail
.pre
;}public void addHead(Node<K,V> node
){node
.next
= head
.next
;node
.pre
= head
;head
.next
.pre
= node
;head
.next
= node
;}public void removeNode(Node<K,V> node
){node
.next
.pre
= node
.pre
;node
.pre
.next
= node
.next
;node
.next
= null;node
.pre
= null;}
}public LRUCache(int capacity
) {this.capacity
= capacity
;map
= new HashMap<>();list
= new DoubleLinkedList<>();}public int get(int key
) {
if(map
.containsKey(key
)){Node<Integer,Integer> node
= map
.get(key
);list
.removeNode(node
);list
.addHead(node
);return node
.value
;
}
return -1;}public void put(int key
, int value
) {
if(map
.containsKey(key
)){Node<Integer,Integer> node
= map
.get(key
);node
.value
= value
;list
.removeNode(node
);list
.addHead(node
);
}else{Node<Integer,Integer> insertNode
= new Node<Integer,Integer>(key
,value
);if(map
.size()==capacity
){Node<Integer,Integer> lastNode
= list
.getLast();map
.remove(lastNode
.key
);map
.put(key
,insertNode
);list
.removeNode(lastNode
);list
.addHead(insertNode
);}else{list
.addHead(insertNode
);map
.put(key
,insertNode
);}}}
}
總結
以上是生活随笔為你收集整理的手写LRU算法的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。