LRU缓存机制

本文详细介绍了LRU(Least Recently Used)内存缓存机制的核心概念、工作原理及实例应用,通过具体例子展示了如何利用LRU机制优化内存管理,提升系统性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在看Android内存优化的文档的时候,有一段提到了LRU内存缓存机制,当时一下没想起来,遂search in net.然后知道真相的我眼泪掉下来,%>_<%
大学时候学的操作系统只是都扔了,想起操作系统老师的满头白发╮(╯▽╰)╭
老师 对不起您 鞠躬
下面背一段书。

LRU

LRU是Least Recently Used 的缩写,翻译过来就是最近最少使用。机制是把最近最少使用的数据移除,放入最新读取的数据。
一种很好理解的机制:最近使用的可能马上就会再次使用,把他放入缓存,可在一般情况下加快读取速度。
举例时间:
一块空间为3的缓存。按顺序读入4,3,2,1,3,2,1
那么缓存内容应该是这样的:
4-》3 4-》2 3 4-》1 2 3-》3 1 2-》2 3 1-》1 2 3。
简单明了~

### LRU缓存机制工作原理 LRU(Least Recently Used,最近最少使用)是一种常用的页面置换算法。当物理内存块不足以容纳所有正在执行的程序所需分配的空间时操作系统将寻找最长时间未被使用的页面将其移出内存。在缓存场景下,LRU用于决定哪些数据项应被淘汰以腾出空间给新加入的数据项。 为了实现高效的`get`和`put`操作,通常采用哈希表与双向链表相结合的方式[^3]。具体来说: - **哈希表**:提供快速查找功能,键映射到对应的节点位置。 - **双向链表**:维护元素顺序,头部表示最新访问过的元素而尾部则是最久未使用的元素。 每次调用`get(key)`方法获取某个key对应value的同时也会更新此条目至链表头端表明它是刚被访问过的内容;每当执行`put(key,value)`插入新的KV对或者覆盖已有记录时同样要调整相应结点的位置确保它成为最新的项目之一。一旦超出预设的最大容量(capacity),就自动删除位于列表末端代表最旧的那个entry来释放资源。 以下是基于上述描述的一个Python版本的具体实现示例: ```python from collections import OrderedDict class LRUCache: def __init__(self, capacity: int): self.cache = OrderedDict() self.capacity = capacity def get(self, key: int) -> int: if key not in self.cache: return -1 val = self.cache.pop(key) # Move the accessed item to the end. self.cache[key] = val return val def put(self, key: int, value: int) -> None: if key in self.cache: del self.cache[key] elif len(self.cache) >= self.capacity: # Pop the first element as it is least recently used. old_key = next(iter(self.cache)) del self.cache[old_key] self.cache[key] = value # Your LRUCache object will be instantiated and called as such: # obj = LRUCache(capacity) # param_1 = obj.get(key) # obj.put(key,value) ``` 这段代码利用了 Python 内置模块 `OrderedDict`, 它可以记住字典中元素添加的先后次序,并支持通过 `.popitem(last=False)` 方法弹出最早插入的那一项从而达到淘汰策略的要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值