缓存的基本假设是,数据会被多次访问,一般访问数据时,都先从缓存中找,缓存中没有再从主存中找,找到后,再放入缓存,这样,下次如果再找相同数据,访问就快了。...LRU是一种流行的替换算法,它的全称是Least Recently Used,最近最少使用,它的思路是,最近刚被使用的很快再次被用的可能性最高,而最久没被访问的很快再次被用的可能性最低,所以被优先清理。...import java.util.LinkedHashMap; import java.util.Map; /** * Created by 11 on 2017/5/18. */ public...class LRUCache extends LinkedHashMap { private int maxEntries; public LRUCache(int...cache.put("d", "call"); System.out.println(cache); } } 输出结果: {c=call, a=abstract, d=call} 参考链接:剖析LinkedHashMap
今天我们来深入探索一下LinkedHashMap的底层原理,并且使用linkedhashmap来实现LRU缓存。 摘要: HashMap和双向链表合二为一即是LinkedHashMap。...的先后顺序来迭代元素(LinkedHashMap根据双向链表重写了迭代器) //同时,新put进来的Entry是最近访问的Entry,把其放在链表末尾 ,也符合LRU算法的实现 e.addBefore...的先后顺序来迭代元素(LinkedHashMap根据双向链表重写了迭代器) //同时,新put进来的Entry是最近访问的Entry,把其放在链表末尾 ,也符合LRU算法的实现 e.addBefore...使用LinkedHashMap实现LRU算法 如下所示,笔者使用LinkedHashMap实现一个符合LRU算法的数据结构,该结构最多可以缓存6个元素,但元素多余六个时,会自动删除最近最久没有被使用的元素...实现LRU可以直接实现继承linkedhashmap并重写removeEldestEntry方法来设置缓存大小。jdk中实现了LRUCache也可以直接使用。
在Android中实用LRU+软引用(弱引用)的方法来缓存图片,可以减少内存溢出的情况。...实现思路: 在把图片保存到LRU集合中的时候,同时保存在一个弱引用的集合之中,如果此元素被LRU算法删除,可能垃圾回收器还并没有回收,可以通过弱引用的集合获取到此引用。...已经为我们自己实现LRU算法提供了便利。...LinkedHashMap继承了HashMap底层是通过Hash表+单向链表实现Hash算法,内部自己维护了一套元素访问顺序的列表。...LRU,那么哪里LinkedHashMap是如何实现LRU的呢?
的底层原理,并且使用linkedhashmap来实现LRU缓存。...的先后顺序来迭代元素(LinkedHashMap根据双向链表重写了迭代器) //同时,新put进来的Entry是最近访问的Entry,把其放在链表末尾 ,也符合LRU算法的实现 e.addBefore...的先后顺序来迭代元素(LinkedHashMap根据双向链表重写了迭代器) //同时,新put进来的Entry是最近访问的Entry,把其放在链表末尾 ,也符合LRU算法的实现 e.addBefore...使用LinkedHashMap实现LRU算法 如下所示,笔者使用LinkedHashMap实现一个符合LRU算法的数据结构,该结构最多可以缓存6个元素,但元素多余六个时,会自动删除最近最久没有被使用的元素...实现LRU可以直接实现继承linkedhashmap并重写removeEldestEntry方法来设置缓存大小。jdk中实现了LRUCache也可以直接使用。
对于缓存来说,我相信很多人都不会陌生。一般的,对于常用的一些数据,基础数据等,也或者是为了高并发,比如抢购等把热点数据放入缓存中以实现高并发快速响应。...今天我们一起来通过 LinkedHashMap 来打造两个 FIFO 和 LRU 机制的缓存系统。 FIFO 很好理解,就是 First In First Out,先入先出。...根据这个 FIFO 的这个特点,我们就可以通过 LinkedHashMap 来实现这种机制的缓存系统了。 ? 上面几行代码就搞定了 FIFO 机制的缓存。测试代码也很简单,如下所示: ?...通过上面这个测试结果,可以看出,这个缓存系统并不完美。当我更新元素后,我想让它重新插入队列,相当于重新入队。因为它刚刚被更新过,说明使用频次可能更高一些。于是 LRU,这种缓存淘汰机制就应用而生了。...实现代码如下所示: ? 下面我们来看看测试代码: ? 运行之后的效果截图如下所示: ? 关于缓存算法,还有 LFU 算法。这个代码较多,我后面单独来实现。
一、概述 Android提供了LRUCache类,可以方便的使用它来实现LRU算法的缓存。...Java提供了LinkedHashMap,可以用该类很方便的实现LRU算法,Java的LRULinkedHashMap就是直接继承了LinkedHashMap,进行了极少的改动后就可以实现LRU算法。...二、Java的LRU算法 Java的LRU算法的基础是LinkedHashMap,LinkedHashMap继承了HashMap,并且在HashMap的基础上进行了一定的改动,以实现LRU算法。...LinkedHashMap就是通过header的双向链表来实现LRU算法的。header.after永远指向最近最不常使用的那个节点,删除的话,就是删除这个header.after对应的节点。...三、Android的LRU算法 Android同样提供了HashMap和LinkedHashMap,而且总体思路有些类似,但是实现的细节明显不同。
先进先出 — FIFO FIFO 即 First In First Out 的缩写,这可以说是实现起来最简单的一种算法了。 缓存维护一个队列,总是在队首插入数据,当缓存区满时,则删除队尾数据。...LRU 的实现 — python 标准库 functools.lru_cache 装饰器的实现 python 标准库中的 functools.lru_cache 装饰器实现了一个 LRU 算法的缓存,用来缓存方法所有参数与返回值的对应关系...关于 python 的闭包与装饰器,参考此前的文章: python 的闭包特性 python 中的装饰器及其原理 3.1....通过缓冲区与环形双向链表的同步操作完成 LRU 算法的实现。...】 此时需要触发 LRU 缓存淘汰算法,此时将 root 的 key 与 result 分别赋值为待插入节点对应的值,向后移动 root,将 root 的 key、result 分别赋值为 None,从而实现
那天我在 LeetCode 上刷到一道 LRU 缓存机制的问题,第 146 题,难度为中等,题目如下。 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。...我一看这题我熟啊,当初看 LinkedHashMap源码的时候,源码中有注释提到了它可以用来实现 LRU 缓存。原文是这么写的。...LinkedHashMap这种结构非常适合构造 LRU 缓存。 当我看到这段注释的时候,特意去查了一下用 LinkedHashMap实现 LRU 的方法。...LRU 简单实现 你以为这么简单就完了吗,并没有。当我查看官方题解的时候,发现里面是这么说的。 在 Java 语言中,同样有类似的数据结构 LinkedHashMap。...面试官的要求是考考你 LRU 的原理,让你自己实现一个。 那咱们就由LinkedHashMap介绍一下最基础的 LRU 实现。
因此,LinkedHashMap需要重写HashMap的迭代器,实现按照访问顺序迭代元素的功能。 ...在LinkedHashMap中,Entry节点继承了HashMap的Node类,并且新增了before和after指针,因此LinkedHashMap需要重写HashMap的迭代器,实现按照访问顺序来迭代元素...下面以LRU缓存为例,介绍LinkedHashMap的应用。 在实现LRU缓存时,可以使用LinkedHashMap来存储数据,最近访问的元素会被移动到链表的尾部,最老的元素位于链表的头部。...优缺点分析 LinkedHashMap相对于HashMap的优点在于: 可以按照插入顺序和访问顺序迭代元素。 通过维护一个双向链表,可以实现LRU缓存等有序存储和访问的场景。...LinkedHashMap可以应用在需要有序存储和访问的场景,比如LRU缓存、打印日志、调试信息存储等。
---恢复内容开始--- #_*_coding:utf-8_*_ __author__ = 'Linhaifeng' class Foo: def __...
的插入和删除 4、LinkedHashMap的源码分析 5、基于LinkedHashMap实现LRU缓存 6、总结 本文预计需食用二十分钟,请各位食客合理分配时间。...先看看迭代器类,在LinkedHashMap中,也在内部实现了自己的迭代器,内部迭代器都继承自LinkedHashIterator类,该类代码如下: abstract class LinkedHashIterator...基于LinkedHashMap实现LRU缓存 首先还是对LRU缓存做一个相对简单的介绍: LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,...当我们使用LinkedHashMap来实现LRU缓存时,可以通过覆写removeEldestEntry方法可以实现自定义策略的 LRU 缓存。...这种地图非常适合构建LRU缓存。
LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现提供所有可选的映射操作,并允许使用null值和null键。...LinkedHashMap实现与HashMap的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。...在上述HashMap的构造器中,最后会调用init()方法,进行相关的初始化,这个方法在HashMap的实现中并无意义,只是提供给子类实现相关的初始化调用。...,这种映射很适合构建LRU缓存。...使用LinkedHashMap构建LRU的Cache http://tomyz0223.iteye.com/blog/1035686 基于LinkedHashMap实现LRU缓存调度算法原理及应用 http
特殊的构造函数LinkedHashMap(int,float,boolean)用于创建迭代顺序为上次访问顺序的链表hash结构。从最近最少访问到最近访问,这种map很时候构建LRU缓存。...由此可以看出,LinkedHashMap实际上兼顾了HashMap和链表的优点,默认情况下可以按照插入序构建链表,另外,还可以做为LRU的缓存使用。...,因为如果我们要通过LinkedHashMap来实现一个LRU的缓存,那么必须采用这个构造函数,将accessOrder指定为true。...也就是说,LinkedHashMap本身并不提供删除最老元素的实现,如果要实现LRU的缓存,对老元素进行删除的话,可能这个方法需要我们自己重写来实现。...比如在某些情况下,实现一个基于LRU的缓存,虽然LinkedHashMap本身没有提供删除元素的方法,但是我们可以根据list的长度自行控制,利用accessorder的特性,将超过一定长度的head元素删除
当按照访问顺序进行迭代时,LinkedHashMap可以保证迭代顺序与插入顺序一致。4....Redis内存淘汰策略与LinkedHashMap排序方式的联系Redis的LRU和LFU策略与LinkedHashMap的访问顺序有着紧密的联系。...通过Java中的LinkedHashMap,我们可以实现类似Redis中的LRU策略。...,并重写了removeEldestEntry方法,当缓存容量超过预设值时,会自动删除最老的元素,实现了LRU策略。...---关于博客本文以Redis内存淘汰策略为主题,结合LinkedHashMap的排序方式,详细解释了Redis内存淘汰策略的原理和实现。
什么是LinkedHashMap? LinkedHashMap 是 HashMap 的有序实现。LinkedHashMap 用一条双向链表来维护顺序,迭代的时候也使用自己实现的迭代器。...看一下 LinkedHashMap 覆写的迭代器代码 final LinkedHashMap.Entry nextNode() { LinkedHashMap.Entry e...实现简单的 LRU LRU 全称 Least Recently Used,也就是最近最少使用的意思,是一种内存管理算法,该算法最早应用于 Linux 操作系统。...从而实现 LRU 缓存策略。...最后通过继承 LinkedHashMap 很简单的实现了 LRU 缓存策略。 全文的代码量较多,但都较为好理解。理解JDK的设计思路,探寻背后的实现原理,也是一件很有趣的事。
LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现提供所有可选的映射操作,并允许使用null值和null键。...LinkedHashMap实现与HashMap的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。 注意,此实现不是同步的。...实现LRU算法缓存 前面讲了LinkedHashMap添加元素,删除、修改元素就不说了,比较简单,和HashMap+LinkedList的删除、修改元素大同小异,下面讲一个新的内容。...算法的Cache(缓存),这个类继承自LinkedHashMap,而类中看到没有什么特别的方法,这说明LRUCache实现缓存LRU功能都是源自LinkedHashMap的。...LinkedHashMap可以实现LRU算法的缓存基于两点: 1、LinkedList首先它是一个Map,Map是基于K-V的,和缓存一致 2、LinkedList提供了一个boolean值可以让用户指定是否实现
LinkedHashMap概述: LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现提供所有可选的映射操作,并允许使用null值和null键。...LinkedHashMap实现与HashMap的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。 ...在上述HashMap的构造器 中,最后会调用init()方法,进行相关的初始化,这个方法在HashMap的实现中并无意义,只是提供给子类实现相关的初始化调用。 ..., loadFactor); this.accessOrder = accessOrder; } 该哈希映射的迭代顺序就是最后访问其条目的顺序,这种映射很适合构建LRU缓存。...如果用此映射构建LRU缓存,则非常方便,它允许映射通过删除旧条目来减少内存损耗。 例如:重写此方法,维持此映射只保存100个条目的稳定状态,在每次添加新条目时删除最旧的条目。
/) 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。...实现 LRUCache 类: LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中,...题目要求的1和2相对简单,主要是条件3,当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值。容量和条件1相呼应,关键是怎么理解最久未使用呢?...缓存 不断调整玩具位置,从仓库中取玩具放到摊位和从摊位放回仓库,可以理解为条件二和三 开始撸起来......数组&&对象实现方式 var LRUCache = function (capacity) { // 用数组记录读和写的顺序 this.keys = [] // 用对象来保存key value
allkeys-lru:在主键空间中,优先移除最近未使用的key。 volatile-lru:在设置了过期时间的键空间中,优先移除最近未使用的key。...二、手写LRU缓存 public class LRUCache { private Map map; private final int capacity...; public LRUCache(int capacity) { this.capacity = capacity; //定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序...LinkedHashMap 中的 Entry 集成与 HashMap 的 Entry,但是其增加了 before 和 after 的引用,指的是上一个元素和下一个元素的引用 static class Entry...;当然可以显式设置为 true,代表以访问顺序进行迭代 public LinkedHashMap(int initialCapacity, float loadFactor
领取专属 10元无门槛券
手把手带您无忧上云