首页
学习
活动
专区
工具
TVP
发布

LruCache源码解析

今天我们来聊聊缓存策略相关的内容,LruCache应该说是三级缓存策略会使用到的内存缓存策略。今天我们就来扒一扒这里面的原理,同时也温故温故我们的数据结构方面的知识。...; 3.LFU(Least Frequently Used):最不经常使用。...我们举个例子,比如我们的缓存对象顺序为:(队尾)EDDCBABAEA(队头),那么如果这时候来了个A,这时候要淘汰一个对象,如果是FIFO,这时候就会淘汰的E;如果是LRU的话,这时候就会淘汰的D,因为D被使用过之后接下来再也没有被使用过了...;如果是LFU的话,那么淘汰的就是C了,因为C就被使用过一次。...来实现,我们首先看下LruCache的成员变量和构造函数: public class LruCache { private final LinkedHashMap map

75070
您找到你想要的搜索结果了吗?
是的
没有找到

【Android 应用开发】LruCache 简介

文章目录 LruCache 应用场景 LruCache 算法原理 LruCache 实现 LruCache 参考 LruCache 应用场景 ---- 1....数据写入缓存 : 当需要使用某个数据时 , 将该数据写入缓存 , 此时先对内存使用情况进行一次判定 ; 如果内存不足 , 需要移除缓存数据中的部分内容 , 然后再将数据写入缓存 ; 当然 , 如果缓存内存足够...LruCache 引入 : 那么如何确定删除缓存中的哪些数据呢 , 这里就需要用到 LruCache 了 ; LruCache 算法原理 ---- LRU ( Least Recently Used 最近最少使用...缓存空间没有满 : 如果缓存空间没有满 , 直接将元素放在队首 ; 缓存队列中 , 队尾的元素就是最近最少使用的元素 , 因为其一旦使用就会提升到队首 , 因此当缓存满了以后 , 就删除队尾的元素 ;..., 就将最后一个最近最少使用的元素删除 ; 2.

34930

Glide都在用的LruCache,你学会了吗?

先来一段百度百科的“科学”解释:LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。...w=1322&h=768&f=png&s=489145] 使用方法及结果 在项目中直接导入Glide的库,调用内部的LruCache来看看效果。...LruCache lruCache = new LruCache(2); lruCache.put("1", 1); lruCache.put("2", 2); lruCache.put...initialMaxSize * multiplier); evict(); } 也就是用于调控我们的最大容量大小,但是我觉得还是没啥用,可是是我太菜了吧,这个方法没有其他调用它的方法,是一个我们直接在使用过程中使用的...也就是最近使用的数据应该调换到最后开始的位置,他到底实在哪里进行处理的呢?

52740

Android缓存机制——LruCache的详解

(Least Recently Used)缓存算法便应运而生,LRU是最近最少使用的算法,它的核心思想是当缓存满时,会优先淘汰那些最近最少使用的缓存对象。...LRU原理 LruCache的核心思想很好理解,就是要维护一个缓存对象列表,其中对象列表的排列方式是按照访问顺序实现的,即一直没访问的对象,将放在队头,即将被淘汰。...(队尾添加元素,队头删除元素) LruCache 其实使用了 LinkedHashMap 双向链表结构,现在分析下 LinkedHashMap 使用方法。...4. get方法 当调用LruCache的get()方法获取集合中的缓存对象时,就代表访问了一次该元素,将会更新队列,保持整个队列是按照访问顺序排序。...也就是说: 这个方法的作用就是将刚访问过的元素放到集合的最后一位 总结: LruCache的核心原理就是对LinkedHashMap 对象的有效利用。

80940

【Android 内存优化】Bitmap 内存缓存 ( Bitmap 缓存策略 | LruCache 内存缓存 | LruCache 常用操作 | 工具类代码 )

LruCache 简介 : 内存缓存一般使用 LruCache , 在 【Android 应用开发】LruCache 简介 博客中有简要介绍 ; ① LRU 算法 : LruCache 使用 LRU (...数据结构 : 该队列使用双向链表实现 , 实际存放内存数据的是 LinkedHashMap 集合 ; // 这是定义杂 LruCache 中的内部集合 private final LinkedHashMap...* 返回 LruCache 的键和值的大小 , 单位使用用户自定义的单位 * 默认的实现中 , 返回 1 ; size 是 键值对个数 , 最大的 size 大小是最多键值对个数...* Bitmap 内存缓存 * 单纯使用 LruCache 缓存图片到内存中 */ public class BitmapLruCache { private static final String...(lruCacheMemoryByte){ /** * 返回 LruCache 的键和值的大小 , 单位使用用户自定义的单位

1.9K20

Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅

异步加载图片的例子,网上也比较多,大部分用了HashMap> imageCache ,但是现在已经不再推荐使用这种方式了,因为从 Android...另外,Android 3.0 (API Level 11)中,图片的数据会存储在本地的内存当中,因而无法用一种可预见的方式将其释放,这就有潜在的风险造成应用程序的内存溢出并崩溃,所以我这里用得是LruCache...来缓存图片,当存储Image的大小大于LruCache设定的值,系统自动释放内存,这个类是3.1版本中提供的,如果你是在更早的Android版本中开发,则需要导入android-support-v4的jar...和滑动过程中取消下载任务,停下来的时候才去下载这2点比较好,值得我学习,然后我就将我的项目异步加载这一块改了下,发到这里做个记录吧,以后类似的异步加载图片直接拷贝代码,提交开发的效率 这篇文章做了哪些方面的优化 使用了线程池来管理下载任务...使用LruCache来缓存图片 使用手机来缓存图片 GridView滑动的时候取消下载任务,静止的时候进行下载,GridView滑动更加的流畅 降低了代码的耦合性,结构更加的清晰,便于以后重用 接下来我们先来看看项目的结构

1.1K100

Glide都在用的LruCache,你会几分?

使用方法及结果 在项目中直接导入Glide的库,调用内部的LruCache来看看效果。...LruCache lruCache = new LruCache(2); lruCache.put("1", 1); lruCache.put("2", 2); lruCache.put...initialMaxSize * multiplier); evict(); } 也就是用于调控我们的最大容量大小,但是我觉得还是没啥用,可是是我太菜了吧,这个方法没有其他调用它的方法,是一个我们直接在使用过程中使用的...也就是最近使用的数据应该调换到最后开始的位置,他到底实在哪里进行处理的呢?...最近使用 最久未使用 动作 1 1入内存 2 1 2入内存 1 2 1入内存,交换1和2的使用频率 3 1 3入内存,内存不足,排出2 2 3 2入内存,内存不足,排出1 LruCache 主要用于缓存的处理

44710

漫谈 LevelDB 数据结构(三):LRU 缓存( LRUCache

说回 LevelDB 源码,作为一个工业品,它使用LRUCache 又做了哪些优化和变动呢?下面让我们一块来拆解下 LevelDB 中使用LRUCache,看看有什么不同。...本文首先明确 LRUCache使用方法,然后总览分析 LRUCache 的实现思路,最后详述相关数据结构的实现细节。...缓存使用 在分析 LRUCache 的实现之前,首先了解下 LRUCache使用方法,以明确 LRUCache 要解决的问题。...思路总览 总体上来说,LevelDB 的 LRUCache使用了哈希表和双向链表的实现思路,但又有些不同: 使用数组+链表处理冲突定制了一个极简哈希表,便于控制分配以及伸缩。 多线程支持。...(); ~LRUCache(); // 从构造函数分离出此参数的设置方法,可以让调用者在使用时进行灵活的调整 void SetCapacity(size_t capacity) { capacity

91530

LruCache在美团DSP系统中的应用演进

LruCache简介 LruCache采用的缓存算法为LRU(Least Recently Used),即最近最少使用算法。...下图是LruCache预设上限为N时,将数据M写入后的数据结构。 ? 线程安全的LruCache在读写操作中,全部使用锁做临界区保护,确保缓存使用是线程安全的。...进一步分析可以确定,以上问题的核心是存放于LruCache的数据生命周期对于使用方不透明。解决这一问题的方案是为LruCache中存放的数据添加原子变量的引用计数。...不论是LruCache中还是使用方,每次获取数据指针时,即将引用计数加1;同理,不再持有数据指针时,引用计数减1。...当引用计数为0时,说明数据没有被任何使用使用,且数据已经过期从LruCache中被删除。这时删除数据的操作是安全的。

62340

【设计数据结构】实现一个 LRUCache

运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。...将 LRU 翻译成大白话就是:当不得不淘汰某些数据时(通常是容量已满),选择最久未被使用的数据进行淘汰。 题目让我们实现一个容量固定的 LRUCache 。...来理解,假设我们有容量为 的 LRUCache 和 测试键值对 [1-1,2-2,3-3] ,将其按照顺序进行插入 & 查询: 插入 1-1,此时最新的使用数据为 1-1 插入 2-2,此时最新使用数据变为...2-2 查询 1-1,此时最新使用数据为 1-1 插入 3-3,由于容器已经达到容量,需要先淘汰已有数据才能插入,这时候会淘汰 2-2,3-3 成为最新使用数据 键值对存储方面,我们可以使用「哈希表」...双向链表 具体的,我们使用哈希表来存储「键值对」,键值对的键作为哈希表的 Key,而哈希表的 Value 则使用我们自己封装的 Node 类,Node 同时作为双向链表的节点。

63930

【设计数据结构】实现一个 LRUCache(手写双向链表入门题)

运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。...将 LRU 翻译成大白话就是:当不得不淘汰某些数据时(通常是容量已满),选择最久未被使用的数据进行淘汰。 题目让我们实现一个容量固定的 LRUCache 。...可以通过 来理解,假设我们有容量为 的 LRUCache 和 测试键值对 [1-1,2-2,3-3] ,将其按照顺序进行插入 & 查询: 插入 1-1,此时最新的使用数据为 1-1 插入 2-...2,此时最新使用数据变为 2-2 查询 1-1,此时最新使用数据为 1-1 插入 3-3,由于容器已经达到容量,需要先淘汰已有数据才能插入,这时候会淘汰 2-2,3-3 成为最新使用数据 键值对存储方面...双向链表 具体的,我们使用哈希表来存储「键值对」,键值对的键作为哈希表的 Key,而哈希表的 Value 则使用我们自己封装的 Node 类,Node 同时作为双向链表的节点。

44850

☆打卡算法☆LeetCode 146. LRU 缓存 算法解析

一、题目 1、算法题目 “设计并实现一个满足  LRU (最近最少使用) 缓存 约束的数据结构。” 题目链接: 来源:力扣(LeetCode) 链接: 146....LRU 缓存 - 力扣(LeetCode) 2、题目描述 请你设计并实现一个满足  LRU (最近最少使用) 缓存 约束的数据结构。...如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。 函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。...lRUCache = new LRUCache(2); lRUCache.put(1, 1); // 缓存是 {1=1} lRUCache.put(2, 2); // 缓存是 {1=1, 2=2} lRUCache.get...三、总结 使用哈希表和双向链表来实现LRU缓存机制: 双向链表按照被使用的顺序存储了键值对,靠近头部的键值对是最近使用的 哈希表通过缓存数据的键值对映射到其在双向链表中的位置。

22510
领券