当前位置: 首页 > 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.xdnf.cn/news/1386397.html

相关文章:

  • 扩展中国剩余定理脚本(恢复密文c)
  • 匠心传承,古韵新生——记木雕名家龙巍的艺术人生
  • Android 打包适配15 版本(api 35)问题处理
  • 【观成科技】蔓灵花User下载者加密通信分析
  • 微硕WINSOK高性能NP沟道MOS管WSP4067在Type-C双向快充电源管理系统中的应用
  • 美摄科技受邀参加2025中关村论坛年会,以超高清车载影像技术赋能智慧出行新体验!
  • 4x12G-SDI(四链接12G-SDI)
  • Lambda 表达式在 PyQt/PySide 中的应用
  • 突破传统企业组网瓶颈:某科技公司智能组网服务项目深度解析
  • Docker部署单节点使用KRaft存储数据的Kafka与可视化界面Kafka-Map
  • 解决多种类潮湿敏感元器件的多温度、多时长的排潮烘干
  • 网络编程 04:TCP连接,客户端与服务器的区别,实现 TCP 聊天及文件上传,Tomcat 的简单使用
  • CVPR 强化学习模块深度分析:连多项式不等式+自驾规划
  • 判断语句中std::cin隐式转换为bool--重载operator bool()
  • 外卖大战之后,再看美团的护城河
  • autojs RSA加密(使用public.pem、private.pem)
  • IAR工程如何生成compile_commands.json文件(能生成但是clangd不能生成“.cache文件”)
  • 水质溶解氧检测仪:用于测量水体中溶解氧浓度的专业设备
  • Partner 类开发:会议参与者可视化控件
  • Excel Word Pdf 格式转换
  • 深入解析Qt节点编辑器框架:高级特性与性能优化(四)
  • Kafka 副本同步异常与 ISR 收缩故障排查实录
  • 自动化Reddit 效率已ready
  • Linux(0)|梦开始的地方:xshell下载
  • 表达式语言EL
  • Java全栈工程师的实战面试:从基础到微服务架构
  • More Effective C++ 条款16:牢记80-20准则(Remember the 80-20 Rule)
  • 对于01背包的一些疑问
  • 第十三章项目资源管理--13.8 控制资源
  • 数学七夕花礼(MATLAB版)