LRU 缓存淘汰策略

LRU 缓存淘汰策略

1、基本介绍
  1. LRU,全称 Least Recently Used,即最近最少使用,它是一种经典的缓存淘汰策略

  2. 当缓存空间满了,需要腾出位置放新数据时,LRU 会优先淘汰那个最久没有被访问过的数据

  3. LRU 通常需要支持如下两种操作,且要求高效,一般是 O(1) 时间复杂度

    访问数据(get)

    复制代码
     如果数据在缓存中,把它标记为最近使用,并移到最前面
    
     如果不在,返回空

    插入数据(put)

    复制代码
     如果数据已存在,更新值并移到最前面
    
     如果不存在,插入到最前面
    
     如果插入后超出容量,删除最后面(最久未使用)的那个数据
  4. 为了在 O(1) 时间内完成查找、插入和删除,LRU 通常结合如下两种数据结构

    哈希表:实现 O(1) 的快速查找,判断某个 key 是否在缓存中

    双向链表:维护访问顺序。链表头部是最近使用的,尾部是最久未使用的。因为需要频繁移动节点,所以用双向链表而不是单链表

2、举例说明
  • 假设缓存容量为 3
  1. 访问 A → 缓存:[A]

  2. 访问 B → 缓存:[B, A]

  3. 访问 C → 缓存:[C, B, A]

  4. 访问 A → A 被移到最前 → 缓存:[A, C, B]

  5. 插入 D → 容量满了,淘汰最久未使用的 B → 缓存:[D, A, C]

3、应用场景
  1. CPU 缓存:利用局部性原理,保留最近使用的内存块

  2. 数据库缓冲池:例如,MySQL 的 InnoDB 缓冲池,用 LRU 的变体来管理内存页

  3. 操作系统页面置换:决定哪些内存页可以被换出

  4. Redis:作为缓存淘汰策略之一

  5. 浏览器 / HTTP 缓存:决定哪些资源保留在本地

4、优缺点
(1)优点
  1. 实现相对简单,命中率在多数场景下表现不错

  2. 符合最近使用过的东西更可能被再次使用的直觉

(2)缺点
  1. 对偶发性的批量操作不友好。例如,一次性扫描大量数据,会把原本的热点数据全部挤出去,导致缓存命中率骤降。这被称为缓存污染

  2. 实际系统中常用改进版,例如,LRU-K、2Q、LFU 等

相关推荐
IT规划师7 分钟前
Redis 数据类型全解 - Bitfield:99% 开发者没用过的位域操作,把内存再砍 80%(七)
redis·bitfield·位域
Rabitebla8 小时前
【Linux 底层原理】进程(十):进程等待详解---从僵尸进程到 wait、waitpid 与 status
linux·c++·笔记·学习·visual studio
Decay__8 小时前
18_MySQL 智能巡检方案 —— 巡检项清单 / 一键巡检脚本 / 健康评分
运维·数据库·sql·mysql·架构
凤凰院凶涛QAQ10 小时前
《MySQL内核拆解:从SQL到InnoDB》(四) : 联合查询 & 视图
数据库·sql·mysql
张小姐的猫10 小时前
【MySQL】访问 & 数据流动原理
android·数据库·mysql·adb·1024程序员节
其实防守也摸鱼12 小时前
个人学习 Pwn 思路:从基础到漏洞利用的进阶路径
大数据·前端·人工智能·chrome·算法·安全·网络安全
Nuanyt12 小时前
LeetCode Hot 100 链表专题(五)· 2 题(Java)
java·算法·leetcode·链表
无心水13 小时前
24、系统架构师论文写作专题 核心考点与学习笔记
笔记·学习·系统架构·架构师·安全架构·软考架构师·软考系统架构设计师