LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。

LRU正如我们日常生活时使用手机那样子:我们会打开多个应用,在后台应用管理可以看到你打开的应用列表,最近的开的排的靠前,比较旧的没用就靠的比较后了。可是,要知道,我们的手机内存是有限的,如果开太多应用,把内存都占满,那么手机就特别卡了。所以,在这时候,手机会自动清理内存,过程如下:会将最久未使用的应用程序进程停止(判定为无用的数据),就是按照时间来,然后停掉倒数第二久未使用的应用......以此类推,直到有足够空间才停止清理。如果你又去访问未停止的应用,那么他就跳到了我们后台应用列表的第一个了。

LRU算法就是这样的,将最久、最少使用的数据进行淘汰。


如果叫我们设计一个LRU算法如何设计呢?

  • 要接受一个最大的缓存容量 capacity

  • 实现两个方法:

    • get(int key):获取key对应的val
    • put(int key, int value):存入新的键值对,如果存在的话就更新val
    • 注意:不管是访问,还是添加 已存在 / 不存在 键值对,那么就说明访问了该数据
  • 使用双向链表和哈希表的结合实现LRU算法: 哈希表的查找速度快,但是是无序的; 而链表是有序的, 但是查找速度慢, 为\(O(N)\), 所以我们可以利用这两个特性,结合起来,形成了哈希链表, 这样的话,get和put都是\(O(1)\)的时间复杂度了, 图解如下:

这对应力扣上面的142题以及我的题解,大家可以去练习一下,相信你写过一遍就会明白其中原理了...

什么是LRU缓存淘汰机制的更多相关文章

  1. 04 | 链表(上):如何实现LRU缓存淘汰算法?

    今天我们来聊聊“链表(Linked list)”这个数据结构.学习链表有什么用呢?为了回答这个问题,我们先来讨论一个经典的链表应用场景,那就是+LRU+缓存淘汰算法. 缓存是一种提高数据读取性能的技术 ...

  2. 链表(上):如何实现LRU缓存淘汰算法?

    一.什么是链表 和数组一样,链表也是一种线性表. 从内存结构来看,链表的内存结构是不连续的内存空间,是将一组零散的内存块串联起来,从而进行数据存储的数据结构. 链表中的每一个内存块被称为节点Node. ...

  3. 链表:如何实现LRU缓存淘汰算法?

    缓存淘汰策略: FIFO:先入先出策略 LFU:最少使用策略 LRU:最近最少使用策略   链表的数据结构: 可以看到,数组需要连续的内存空间,当内存空间充足但不连续时,也会申请失败触发GC,链表则可 ...

  4. 《数据结构与算法之美》 <04>链表(上):如何实现LRU缓存淘汰算法?

    今天我们来聊聊“链表(Linked list)”这个数据结构.学习链表有什么用呢?为了回答这个问题,我们先来讨论一个经典的链表应用场景,那就是 LRU 缓存淘汰算法. 缓存是一种提高数据读取性能的技术 ...

  5. Redis 的缓存淘汰机制(Eviction)

    本文从源码层面分析了 redis 的缓存淘汰机制,并在文章末尾描述使用 Java 实现的思路,以供参考. 相关配置 为了适配用作缓存的场景,redis 支持缓存淘汰(eviction)并提供相应的了配 ...

  6. 数据结构与算法之美 06 | 链表(上)-如何实现LRU缓存淘汰算法

    常见的缓存淘汰策略: 先进先出 FIFO 最少使用LFU(Least Frequently Used) 最近最少使用 LRU(Least Recently Used) 链表定义: 链表也是线性表的一种 ...

  7. 详解工程师不可不会的LRU缓存淘汰算法

    大家好,欢迎大家来到算法数据结构专题,今天我们和大家聊一个非常常用的算法,叫做LRU. LRU的英文全称是Least Recently Used,也即最不经常使用.我们看着好像挺迷糊的,其实这个含义要 ...

  8. Chapter 6 链表(上):如何实现LRU缓存淘汰算法?

    缓存淘汰策略: 一.什么是链表? 1.和数组一样,链表也是一种线性表. 2.从内存结构来看,链表的内存结构是不连续的内存空间,是将一组零散的内存块串联起来,从而进行数据存储的数据结构. 3.链表中的每 ...

  9. LRU缓存淘汰算法

    什么是LRU算法? LRU是Least Recently Used的缩写,即最近最少使用,在有限的内容块中存储最近使用次数最多的数据,当内容块已满时,把最少使用的数据删除以便存储新的内容.

随机推荐

  1. IDEA 简拼输入

    1. sout = System.out.println(); 2. soutp = System.out.println(""); 3. soutv = System.out.p ...

  2. day47 Pyhton 数据库Mysql 04

    # 表结构 # 建表 - 表的增加 # create table # 删表 - 表的删除 # drop table # 改表 - 表的修改 # alter table 表名 # rename 新表名 ...

  3. 不出意外,排名第一的还是它,程序员为什么都喜欢用Chrome?

    程序员为什么喜欢使用Chrome? 其实不单单是程序员喜欢使用Chrome,现在大多数的小伙伴都使用Chrome. 我们可以看到Netmarketshare发布了2020年7月的操作系统与浏览器市场份 ...

  4. selenium基础--登录简单的网站

    import time from selenium import webdriver from lxml import etree from selenium.webdriver import Act ...

  5. python web自动化上传文件工具

    工具下载地址:链接:https://pan.baidu.com/s/1cHdNHW 密码:56bp说明:1.WinSpy-1.0.2.7z解压即可.2.pywin32的exe程序,根据自己安装的pyt ...

  6. Linux基础命令cp之拷贝隐藏文件

    创建一个用户名为test211的普通用户 [23:35:09 root@C8[ ~]#useradd test211 [23:37:37 root@C8[ ~]#getent passwd test2 ...

  7. Elasticsearch(5):添加文档

      1 ES数据读写流程¶ ES中,每个索引都将被划分为若干分片,每个分片可以有多个副本.这些副本共同组成复制组,复制组中的分片在添加或删除文档时必须保持同步,否则,从一个副本中读取的数据将与从另一个 ...

  8. git -- Authentication failed for 报错如何解决?

    昨天拉代码拉不下来,报这个错误:fatal: Authentication failed for .... 有很多网上的解释是 $  git config --global --replace-all ...

  9. 文件开启关闭操作c语言模板

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <stri ...

  10. RestTemplate+Ribbon实现服务调用

    一,通过LoadBalancerClient取得uri,然后RestTemplate 调用 1, 注入LoadBalancerClient @Autowired LoadBalancerClient ...