LruCache的介绍 LruCache是个泛型类,主要算法原理是把最近使用的对象用强引用存储在 LinkedHashMap中,当缓存满时,把最近最少使用的对象从内存中移除,并提供了get和put方法来完成缓存的获取和添加操作 LruCache的使用 // 设置LruCache缓存的大小,一般为当前进程可用容量的1/8 int cacheSize = (int) (Runtime.getRuntime().totalMemory () / 8); LruCache<String, Bitmap> mMemoryCache = new LruCache<String, Bitmap>(cacheSize) { // 重写 LruCache的实现原理 LruCache的核心思想:维护一个缓存对象列表,其中对象列表的排列方式是按照访问顺序实现的,即一直没有访问的对象,将放在队头,最早被淘汰,而最近访问的对象将放在队尾,最晚被淘汰 LruCache的实现是使用LinkedHashMap来维护这个对象队列的。
今天我们来聊聊缓存策略相关的内容,LruCache应该说是三级缓存策略会使用到的内存缓存策略。今天我们就来扒一扒这里面的原理,同时也温故温故我们的数据结构方面的知识。 来实现,我们首先看下LruCache的成员变量和构造函数: public class LruCache<K, V> { private final LinkedHashMap<K, V> map 我们刚才看到LruCache构造函数里面LinkedHashMap的初始化的第三个参数accessOrder被赋值为true是什么意思呢? 到这里我们已经明白了LinkedHashMap的工作原理了,那么我们接下来就来看看LruCache的源码了。 LruCache源码 熟悉了LinkedHashMap的数据结构,我们就很容易知道怎么用这个来实现LRU算法了,我们先来看看LruCache的get()方法的源码: public final V get
领8888元新春采购礼包,抢爆款2核2G云服务器95元/年起,个人开发者加享折上折
概述 记得在很早之前,我有写过一篇文章Android高效加载大图、多图解决方案,有效避免程序OOM,这篇文章是翻译自Android Doc的,其中防止多图OOM的核心解决思路就是使用LruCache 但LruCache只是管理了内存中图片的存储与释放,如果图片从内存中被移除的话,那么又需要从网络上重新加载一次图片,这显然非常耗时。 感兴趣的朋友请继续阅读 Android照片墙完整版,完美结合LruCache和DiskLruCache 。
序 本文主要研究一下dubbo的LRUCache th (3).jpeg LRUCache dubbo-2.7.2/dubbo-common/src/main/java/org/apache/dubbo /common/utils/LRUCache.java public class LRUCache<K, V> extends LinkedHashMap<K, V> { private static private final Lock lock = new ReentrantLock(); private volatile int maxCapacity; public LRUCache () { this(DEFAULT_MAX_CAPACITY); } public LRUCache(int maxCapacity) { super <String, Integer> cache = new LRUCache<String, Integer>(); assertThat(cache.getMaxCapacity(),
---- 有了LinkedHashMap的基础我们来看LruCache的源码就很好理解了 put /** * Caches {@code value} for {@code key}.
概述 LruCache的核心原理就是对LinkedHashMap的有效利用,它的内部存在一个LinkedHashMap成员变量,值得注意的4个方法:构造方法、get、put、trimToSize LRU LRU原理 LruCache的核心思想很好理解,就是要维护一个缓存对象列表,其中对象列表的排列方式是按照访问顺序实现的,即一直没访问的对象,将放在队头,即将被淘汰。 (队尾添加元素,队头删除元素) LruCache 其实使用了 LinkedHashMap 双向链表结构,现在分析下 LinkedHashMap 使用方法。 4. get方法 当调用LruCache的get()方法获取集合中的缓存对象时,就代表访问了一次该元素,将会更新队列,保持整个队列是按照访问顺序排序。 也就是说: 这个方法的作用就是将刚访问过的元素放到集合的最后一位 总结: LruCache的核心原理就是对LinkedHashMap 对象的有效利用。
在了解我们的LRUCache之前自然是需要知道什么是LRU了。 LruCache lruCache = new LruCache<String, Integer>(2); lruCache.put("1", 1); lruCache.put("2", 2); lruCache.put ("1", 1); lruCache.put("3", 3); System.out.println(lruCache.get("1")); System.out.println(lruCache.get LruCache源码导读 先看看LruCache的变量家庭里有哪些小家伙把。 new LruCache<T, Y>(size) public LruCache(long size) { this.initialMaxSize = size; this.maxSize
使用方法及结果 在项目中直接导入Glide的库,调用内部的LruCache来看看效果。 LruCache lruCache = new LruCache<String, Integer>(2); lruCache.put("1", 1); lruCache.put("2", 2); lruCache.put ("1", 1); lruCache.put("3", 3); System.out.println(lruCache.get("1")); System.out.println(lruCache.get LruCache源码导读 先看看LruCache的变量家庭里有哪些小家伙把。 new LruCache<T, Y>(size) public LruCache(long size) { this.initialMaxSize = size; this.maxSize
因此,一个优秀的程序必然会将内存缓存和硬盘缓存结合到一起使用,那么本篇文章我们就来看一看,如何才能将LruCache和DiskLruCache完美结合到一起。 * * @param key * LruCache的键,这里传入图片的URL地址。 * @param bitmap * LruCache的键,这里传入从网络上下载的Bitmap对象。 10M,这样我们就把LruCache和DiskLruCache的初始化工作完成了。 这样我们就把LruCache和DiskLruCache完美结合到一起了。
说回 LevelDB 源码,作为一个工业品,它使用 的 LRUCache 又做了哪些优化和变动呢?下面让我们一块来拆解下 LevelDB 中使用的 LRUCache,看看有什么不同。 本文首先明确 LRUCache 的使用方法,然后总览分析 LRUCache 的实现思路,最后详述相关数据结构的实现细节。 缓存使用 在分析 LRUCache 的实现之前,首先了解下 LRUCache 的使用方法,以明确 LRUCache 要解决的问题。 数据结构 LRUCache 实现主要涉及到了四个数据结构:LRUHandle、HandleTable、LRUCache 和 ShardedLRUCache。 LRUCache—— 哈希表索引+双向环形链表 将之前分析过的导出接口 Cache 所包含的函数去掉后,LRUCache 类简化如下: class LRUCache { public: LRUCache
LruCache简介 LruCache采用的缓存算法为LRU(Least Recently Used),即最近最少使用算法。 LruCache内部维护一个双向链表和一个映射表。 下图为通过LruCache查找key_2后LruCache结构的变化。 ? LruCache + Redis机制的应用演进 在实际应用中,LruCache + Redis机制实践分别经历了引入LruCache、LruCache增加时效清退机制、HashLruCache满足高QPS 下图是增加LruCache结构前后,且增加LruCache后命中率高于95%的情况下,针对持续增长的QPS得出的数据获取平均耗时(ms)对比图: ?
注意:LruCache是有版本限制的,低版本的sdk需要在libs文件夹添加相应的support-4v文件。 SoftReference<Drawable>> imageCache = new HashMap<String, SoftReference<Drawable>>(); private LruCache ).getMemoryClass(); int cacheSize = 1024 *1024 *memClass / 8; mMemoryCache = new LruCache
实现 LRUCache 类: LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中, lRUCache = new LRUCache(2); lRUCache.put(1, 1); // 缓存是 {1=1} lRUCache.put(2, 2); // 缓存是 {1=1, 2=2} lRUCache.get (1); // 返回 1 lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3} lRUCache.get(2); // 返回 -1 (未找到 ) lRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3} lRUCache.get(1); // 返回 -1 (未找到) lRUCache.get 题目让我们实现一个容量固定的 LRUCache 。如果插入数据时,发现容器已满时,则先按照 LRU 规则淘汰一个数据,再将新数据插入,其中「插入」和「查询」都算作一次“使用”。 可以通过 ?
另外,Android 3.0 (API Level 11)中,图片的数据会存储在本地的内存当中,因而无法用一种可预见的方式将其释放,这就有潜在的风险造成应用程序的内存溢出并崩溃,所以我这里用得是LruCache 来缓存图片,当存储Image的大小大于LruCache设定的值,系统自动释放内存,这个类是3.1版本中提供的,如果你是在更早的Android版本中开发,则需要导入android-support-v4的jar ; public class ImageDownLoader { /** * 缓存Image的类,当存储Image的大小大于LruCache设定的值,系统自动释放内存 分配1/8 4M mMemoryCache = new LruCache<String, Bitmap>(mCacheSize){ //必须重写此方法,来测量Bitmap的大小 ,LruCache没有就去sd卡或者手机目录查找,在没有就开启线程去下载 * @param firstVisibleItem * @param visibleItemCount
实现 LRUCache 类: LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中 lRUCache = new LRUCache(2); lRUCache.put(1, 1); // 缓存是 {1=1} lRUCache.put(2, 2); // 缓存是 {1=1, 2=2} lRUCache.get (1); // 返回 1 lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3} lRUCache.get(2); // 返回 -1 (未找到 ) lRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3} lRUCache.get(1); // 返回 -1 (未找到) lRUCache.get 题目让我们实现一个容量固定的 LRUCache 。如果插入数据时,发现容器已满时,则先按照 LRU 规则淘汰一个数据,再将新数据插入,其中「插入」和「查询」都算作一次“使用”。
= new LRU(); lruCache.put(1,3); lruCache.put(2,5); lruCache.put(3,5); lruCache.put(4,77); lruCache.put(5,7); lruCache.put(6,5); lruCache.put(7,7); lruCache = new LRUCache(3); lruCache.put(1,3); lruCache.put(2,5); lruCache.put (3,3); lruCache.put(4,3); lruCache.put(5,3); lruCache.put(6,3); lruCache.put lruCache.put(4,77); lruCache.put(5,7); lruCache.put(6,5); lruCache.put(7,7);
实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中 lRUCache = new LRUCache(2); lRUCache.put(1, 1); // 缓存是 {1=1} lRUCache.put(2, 2); // 缓存是 {1=1, 2=2} lRUCache.get (1); // 返回 1 lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3} lRUCache.get(2); // 返回 -1 (未找到 ) lRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3} lRUCache.get(1); // 返回 -1 (未找到) lRUCache.get (3); // 返回 3 lRUCache.get(4); // 返回 4 示例 2: 二、解题 1、思路分析 这道题的主要解法就是用一个哈希表加一个双向链表来实现。
扫码关注腾讯云开发者
领取腾讯云代金券