一、诞生原因

缓存是一种提供数据读取性能的技术,在硬件设计、软件开发中有广泛的应用,比如常见的 CPU 缓存,DB 缓存和浏览器缓存等。但是缓存的大小是有限的,需要一定的机制判断哪些数据需要淘汰,即:移出缓存,从而保证缓存中的数据始终是常用的。常用的机制里面包括 LRU 缓存淘汰算法。

二、设计原则

全称:Least Recently Used

如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。所以淘汰的数据应该是许久没有访问到的数据。

三、所用的数据结构

  1. 双向链表:用于串联缓存数据。
  2. 红黑树(散列表):用于索引缓存数据。

四、执行过程

假设 data 中包含 key 和 value。

节点为 node(指针)。

1、增加缓存数据时,

若缓存已满,double list 尾部数据 delete 掉,将新 data 压入双向链表头部;

将新 data 压入到红黑树中,key 值为 data 中的 key,value 为 node。

2、获取缓存数据时,

先从红黑树中根据 key 找到 node,将 node 放到双向链表的头部,最后返回 node 中 data。

五、代码栗子

github

六、优化

节选:https://www.cnblogs.com/goodAndyxublog/p/11757134.html

以下方案来源与 MySQL InnoDB LRU 改进算法

将链表拆分成两部分,分为热数据区,与冷数据区,如图所示。

改进之后算法流程将会变成下面一样:

  1. 访问数据如果位于热数据区,与之前 LRU 算法一样,移动到热数据区的头结点。
  2. 插入数据时,若缓存已满,淘汰尾结点的数据。然后将数据插入冷数据区的头结点。
  3. 处于冷数据区的数据每次被访问需要做如下判断:
  • 若该数据已在缓存中超过指定时间,比如说 1 s,则移动到热数据区的头结点。
  • 若该数据存在在时间小于指定的时间,则位置保持不变。

对于偶发的批量查询,数据仅仅只会落入冷数据区,然后很快就会被淘汰出去。热门数据区的数据将不会受到影响,这样就解决了 LRU 算法缓存命中率下降的问题。

参考:极客时间《数据结构与算法之美》王争

这门课真心推荐,内容很经典、栗子很形象,里面还包含了很多面试题目。真是居家旅行必备良药。

(SAW:Game Over!)

数据结构与算法 / LRU 缓存淘汰算法相关推荐

  1. 看动画轻松理解「链表」实现「LRU缓存淘汰算法」

    作者 | 程序员小吴,哈工大学渣,目前正在学算法,开源项目 「 LeetCodeAnimation 」5500star,GitHub Trending 榜连续一月第一. 本文为 AI科技大本营投稿文章 ...

  2. 算法必知 --- LRU缓存淘汰算法

    作者:_code_x 链接:https://www.jianshu.com/p/b7fed77324b9 写在前 就是一种缓存淘汰策略. 计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾 ...

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

    缓存 作用 缓存是一种提高数据读取性能的技术,在硬件设计.软件开发中都有着非常广泛的应用,比如常见的 CPU 缓存.数据库缓存.浏览器缓存等等. 淘汰策略 常见的策略有三种:先进先出策略 FIFO(F ...

  4. 看动画轻松理解「链表」实现「 LRU 缓存淘汰算法」

    作者 | 吴至波 责编 | 胡巍巍 快速挑战Python全栈工程师: https://edu.csdn.net/topic/python115?utm_source=csdn_bw 前几节学习了「链表 ...

  5. 看动画理解「链表」实现LRU缓存淘汰算法

    前几节学习了「链表」.「时间与空间复杂度」的概念,本节将结合「循环链表」.「双向链表」与 「用空间换时间的设计思想」来设计一个很有意思的缓存淘汰策略:LRU缓存淘汰算法. 循环链表的概念 如上图所示: ...

  6. leetcode刷题:LRU缓存淘汰算法

    题目: 分析: 计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾位置.但问题是,删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留在缓存里,方便之后继续使用.那么, ...

  7. LRU缓存淘汰算法优化

    上文中提到了LRU 缓存淘汰算法,可以帮助我们更好更合理的去使用缓存.但是它也有一个缺点就是如果有一些不满足"如果数据最近被访问过,那么将来被访问的几率也更高"的规律时,会破坏缓存 ...

  8. 如何基于链表实现 LRU 缓存淘汰算法?

    什么是LRU LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是"如果数据最近被访问过,那么将来被访问的几率也更高" ...

  9. Redis的LRU缓存淘汰算法实现

    1 标准LRU的实现原理 LRU,最近最少使用(Least Recently Used,LRU),经典缓存算法. LRU会使用一个链表维护缓存中每个数据的访问情况,并根据数据的实时访问,调整数据在链表 ...

最新文章

  1. ffmpeg text relocations
  2. 大龄屌丝自学笔记--Java零基础到菜鸟--001
  3. H. Texas hold'em Poker(2019ICPC区域网络赛沈阳站)
  4. java基础第十四天_IO
  5. Python Dataframe转List
  6. 手机蓝绿厂终于转正了,已有“名分”!
  7. 前端学习笔记系列一:1.export default / export const
  8. access html导出,AccessToFile
  9. Android自定义popWindow教程
  10. java毕业设计对外汉语教学辅助平台Mybatis+系统+数据库+调试部署
  11. JavaScript --------WebS APIs学习之本地存储
  12. 征集对智能视觉组eIQ的使用反馈
  13. java代码获取银行实时汇率
  14. Maltego注册问题
  15. 更新后谷歌浏览器皮肤背景自动变成黑色模式
  16. C. Ehab and Path-etic MEXs-Codeforces Round #628 (Div. 2)
  17. 调用阿里云身份证识别OCR
  18. android从底部弹出动画效果,七星电子游戏 -七星电子游戏V8.5.51
  19. 模型预测控制的缺点_华北电力大学 刘英培等:适用于风电并网的VSCHVDC系统模型预测控制...
  20. 爬虫爬取 淘宝联盟,淘宝客阿里妈妈 订单,细节

热门文章

  1. AS3深拷贝数据对象(1)深拷贝基本数据类型
  2. linux统计使用最多的10个命令
  3. 离开当前屏幕的判断方法_EXCEL 一个工作表如何快速拆分多个工作表的方法
  4. Ubuntu 18.04 卡死
  5. ubuntu21.04下终端路径显示优化
  6. kafka在zk中的目录
  7. 【工具推荐】Hadoop集群监控工具 HTools
  8. 【网址收藏】linux namespace和cgroup
  9. oracle jvm规范官网下载及相关书籍推荐
  10. Scala特质(类似Java中的接口)