日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

手写LRU算法

發布時間:2024/4/18 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 手写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);}}} }/*** Your LRUCache object will be instantiated and called as such:* LRUCache obj = new LRUCache(capacity);* int param_1 = obj.get(key);* obj.put(key,value);*/

總結

以上是生活随笔為你收集整理的手写LRU算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。