当前位置: 首页 > news >正文

LRU 内存淘汰策略

系列文章目录

文章目录

  • 系列文章目录
  • 一、LRU-Least recently used
  • 二、自定义LRU


一、LRU-Least recently used

是一种常用的内存淘汰策略,用于在缓存满时删除最近最少使用的数据,核心思想:当缓存空间不足,移除最久未被访问的数据

package com.citi.leetcode;import java.util.LinkedHashMap;public class LRU<K,V> extends LinkedHashMap<K, V> {private final int capacity;public LRU(int capacity) {//true for access order//第三个参数是 accessOrder,设为 true 表示按照访问顺序排序,而不是插入顺序。
//removeEldestEntry() 是 LinkedHashMap 提供的方法,返回 true 时会移除最老的条目(即最近最少使用的)。super(capacity, 0.75f, true);this.capacity = capacity;}@Overrideprotected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) {return size() > capacity;//当缓存空间超过capacity时,返回true,删除最老的节点}public static void main(String[] args) {LRU<Integer, String> cache = new LRU<>(3);cache.put(1, "A");cache.put(2, "B");cache.put(3, "C");System.out.println("After inserting 1,2,3:"+cache);cache.get(1);//访问1,变成最近使用cache.put(4, "D");//插入4,容量已满,移除最久未使用的2System.out.println("After accessing 1 and inserting 4:"+cache);}
}

二、自定义LRU

package com.citi.leetcode;import java.util.HashMap;
import java.util.Map;class LRUCacheManual<K, V> {private final int capacity;private final Map<K, Node> map;private Node head, tail;static class Node<K, V> {K key;V value;Node prev, next;public Node(K key, V value) {this.key = key;this.value = value;}}public LRUCacheManual(int capacity) {this.capacity = capacity;this.map = new HashMap<>();}public V get(K key) {if (!map.containsKey(key)) {return null;}Node node = map.get(key);moveToHead(node);return (V) node.value;}public void put(K key, V value) {if (map.containsKey(key)) {Node node = map.get(key);node.value = value;moveToHead(node);} else {Node newNode = new Node<>(key, value);map.put(key, newNode);addNode(newNode);if (map.size() > capacity) {Node last = tail;map.remove(last.key);removeNode(last);}}}private void addNode(Node node) {node.prev = null;node.next = head;if (head != null) {head.prev = node;}head = node;if (tail == null) {tail = node;}}private void removeNode(Node node) {if (node.prev != null) {node.prev.next = node.next;} else {head = node.next;}if (node.next != null) {node.next.prev = node.prev;} else {tail = node.prev;}}private void moveToHead(Node node) {removeNode(node);addNode(node);}public static void main(String[] args) {LRUCacheManual<Integer, String> cache = new LRUCacheManual<>(3);cache.put(1, "One");cache.put(2, "Two");cache.put(3, "Three");System.out.println(cache.get(1)); // Onecache.put(4, "Four"); // 移除 2System.out.println(cache.get(2)); // nullSystem.out.println(cache.get(1)); // One}
}
http://www.dtcms.com/a/357127.html

相关文章:

  • 【51单片机定时1秒中断控制流水灯方向】2022-11-14
  • Geocodify 的 API
  • 以技术赋能强化消费者信任,助推餐饮服务质量提质增效的明厨亮灶开源了
  • 有鹿机器人:用智能清洁重塑多行业工作方式
  • Centos卸载anaconda
  • 微服务Eureka组件的介绍、安装、使用
  • 音频转音频
  • 数据结构:快速排序 (Quick Sort)
  • 数据结构(C语言篇):(五)单链表算法题(上)
  • Linux笔记13——shell编程基础-7
  • More Effective C++ 条款16:牢记80-20准则(Remember the 80-20 Rule)
  • Java泛型使用常见报错
  • Stream API 讲解
  • 上传文件到本地
  • LeetCode Hot 100 第8天
  • 医疗 AI 的 “破圈” 时刻:辅助诊断、药物研发、慢病管理,哪些场景已落地见效?
  • 174. Java 注释 - 声明注释类型
  • 《AI智脉速递》2025 年 8 月22 日 - 29 日
  • VS2022+QT6.7+NetWork(TCP服务器多客户端助手)
  • Rust 登堂 之 深入Rust 类型(六)
  • 如何打造团队协作型 IP,而非单人依赖型?
  • BugKu Web渗透之file_get_contents
  • Kotlin中回调函数的使用示例
  • Git-Git和TortoiseGit的安装以及使用
  • 云渲染云推流助力WebGL应用网页端无负担推流,摆脱终端加载缓慢问题
  • 无恶意软件勒索:Storm-0501如何转向云原生攻击
  • Linux829 shell:expect interact “ “ set
  • 知识卡片html5动态网页源码
  • CRYPT32!CryptMsgUpdate函数分析之CRYPT32!PkiAsn1Decode函数的作用是得到pci
  • ros2--topic/话题--接口