什么是LRU缓存淘汰机制
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缓存淘汰机制的更多相关文章
- 04 | 链表(上):如何实现LRU缓存淘汰算法?
今天我们来聊聊“链表(Linked list)”这个数据结构.学习链表有什么用呢?为了回答这个问题,我们先来讨论一个经典的链表应用场景,那就是+LRU+缓存淘汰算法. 缓存是一种提高数据读取性能的技术 ...
- 链表(上):如何实现LRU缓存淘汰算法?
一.什么是链表 和数组一样,链表也是一种线性表. 从内存结构来看,链表的内存结构是不连续的内存空间,是将一组零散的内存块串联起来,从而进行数据存储的数据结构. 链表中的每一个内存块被称为节点Node. ...
- 链表:如何实现LRU缓存淘汰算法?
缓存淘汰策略: FIFO:先入先出策略 LFU:最少使用策略 LRU:最近最少使用策略 链表的数据结构: 可以看到,数组需要连续的内存空间,当内存空间充足但不连续时,也会申请失败触发GC,链表则可 ...
- 《数据结构与算法之美》 <04>链表(上):如何实现LRU缓存淘汰算法?
今天我们来聊聊“链表(Linked list)”这个数据结构.学习链表有什么用呢?为了回答这个问题,我们先来讨论一个经典的链表应用场景,那就是 LRU 缓存淘汰算法. 缓存是一种提高数据读取性能的技术 ...
- Redis 的缓存淘汰机制(Eviction)
本文从源码层面分析了 redis 的缓存淘汰机制,并在文章末尾描述使用 Java 实现的思路,以供参考. 相关配置 为了适配用作缓存的场景,redis 支持缓存淘汰(eviction)并提供相应的了配 ...
- 数据结构与算法之美 06 | 链表(上)-如何实现LRU缓存淘汰算法
常见的缓存淘汰策略: 先进先出 FIFO 最少使用LFU(Least Frequently Used) 最近最少使用 LRU(Least Recently Used) 链表定义: 链表也是线性表的一种 ...
- 详解工程师不可不会的LRU缓存淘汰算法
大家好,欢迎大家来到算法数据结构专题,今天我们和大家聊一个非常常用的算法,叫做LRU. LRU的英文全称是Least Recently Used,也即最不经常使用.我们看着好像挺迷糊的,其实这个含义要 ...
- Chapter 6 链表(上):如何实现LRU缓存淘汰算法?
缓存淘汰策略: 一.什么是链表? 1.和数组一样,链表也是一种线性表. 2.从内存结构来看,链表的内存结构是不连续的内存空间,是将一组零散的内存块串联起来,从而进行数据存储的数据结构. 3.链表中的每 ...
- LRU缓存淘汰算法
什么是LRU算法? LRU是Least Recently Used的缩写,即最近最少使用,在有限的内容块中存储最近使用次数最多的数据,当内容块已满时,把最少使用的数据删除以便存储新的内容.
随机推荐
- IDEA 简拼输入
1. sout = System.out.println(); 2. soutp = System.out.println(""); 3. soutv = System.out.p ...
- day47 Pyhton 数据库Mysql 04
# 表结构 # 建表 - 表的增加 # create table # 删表 - 表的删除 # drop table # 改表 - 表的修改 # alter table 表名 # rename 新表名 ...
- 不出意外,排名第一的还是它,程序员为什么都喜欢用Chrome?
程序员为什么喜欢使用Chrome? 其实不单单是程序员喜欢使用Chrome,现在大多数的小伙伴都使用Chrome. 我们可以看到Netmarketshare发布了2020年7月的操作系统与浏览器市场份 ...
- selenium基础--登录简单的网站
import time from selenium import webdriver from lxml import etree from selenium.webdriver import Act ...
- python web自动化上传文件工具
工具下载地址:链接:https://pan.baidu.com/s/1cHdNHW 密码:56bp说明:1.WinSpy-1.0.2.7z解压即可.2.pywin32的exe程序,根据自己安装的pyt ...
- Linux基础命令cp之拷贝隐藏文件
创建一个用户名为test211的普通用户 [23:35:09 root@C8[ ~]#useradd test211 [23:37:37 root@C8[ ~]#getent passwd test2 ...
- Elasticsearch(5):添加文档
1 ES数据读写流程¶ ES中,每个索引都将被划分为若干分片,每个分片可以有多个副本.这些副本共同组成复制组,复制组中的分片在添加或删除文档时必须保持同步,否则,从一个副本中读取的数据将与从另一个 ...
- git -- Authentication failed for 报错如何解决?
昨天拉代码拉不下来,报这个错误:fatal: Authentication failed for .... 有很多网上的解释是 $ git config --global --replace-all ...
- 文件开启关闭操作c语言模板
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <stri ...
- RestTemplate+Ribbon实现服务调用
一,通过LoadBalancerClient取得uri,然后RestTemplate 调用 1, 注入LoadBalancerClient @Autowired LoadBalancerClient ...