JavaScript 进阶实战课
石川
JavaScript Patterns and Anti-Patterns 等开源项目创建者,O'Reilly 技术评审
15066 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
开篇词 (1讲)
JavaScript 进阶实战课
15
15
1.0x
00:00/00:00
登录|注册

17 | 如何通过链表做LRU/LFU缓存?

你好,我是石川。
前面我们在第 10-13 讲讲过了数组这种数据类型,以及通过它衍生出的栈和队列的数据结构。之后,我们在讲到散列表的时候,曾经提到过一种链表的数据结构。今天,我们就来深入了解下链表和它所支持的相关的缓存算法。链表有很多使用场景,最火的例子当属目前热门的区块链了。它就是用了链表的思想,每一个区块儿之间都是通过链表的方式相连的。在链表结构里,每一个元素都是节点,每个节点有自己的内容和相连的下一个元素的地址参考。
既然我们讲的是 JavaScript,还是回到身边的例子,就是缓存。无论是我们的操作系统,还是浏览器,都离不开缓存。我们把链表和散列表结合起来,就可以应用于我们常说的缓存。那这种缓存是如何实现的呢?接下来就先从链表说起吧。

如何实现单双循环链表

单链表

下面我们先来看看一个单向链表是怎么实现的。链表就是把零散的节点(node)串联起来的一种数据结构。在每个节点里,会有两个核心元素,一个是数据,一个是下一个节点的地址,我们称之为后继指针(next)。在下面的例子里,我们先创建了一个节点(node),里面有节点的数据(data)和下一个节点的地址(next)。
在实现上,我们可以先创建一个节点的函数类,里面包含存储数据和下一节点两个属性。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

LRU和LFU缓存算法是常见的缓存策略,本文深入介绍了它们的实现细节和应用场景。首先,文章详细讨论了LFU缓存的实现,包括LFU节点、LFU双链表和相关操作场景。LFU缓存通过两个散列表来实现,一个是键值散列表,另一个是频率散列表。在LFU缓存中,插入、更新和读取是三个核心操作场景。接着,文章提到了LRU缓存的实现方式,强调了需要追踪节点的访问时间,并介绍了LRU缓存的节点和散列表的使用。最后,文章对比了LRU和LFU缓存的使用情况,指出在实际应用中更多地使用LRU的原因。总的来说,LFU没有考虑时间局部性,而LRU更符合实际应用的需求。通过本文的阅读,读者可以深入了解缓存算法的实现细节,对于想要深入了解缓存算法的读者来说,是一篇值得阅读的文章。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《JavaScript 进阶实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(2)

  • 最新
  • 精选
  • 天择
    LRU具备时间“局部”性,而LFU恰恰一种“全局”性。在需要考虑全局频率的场景里面,LFU是有用的。最近有大量访问,不代表始终有大量访问;比如电商的热门商品,可能在几个月的维度上做了统计,如果采用LRU策略,短时促销活动可能会把这些长期热门商品冲出缓存,导致过了促销,原来的热门商品缓存无法命中。

    作者回复: 有道理

    2022-10-27归属地:北京
    3
  • 无咎
    频率分布有规律的场景,比如:点餐,热销的菜品集中在少数几个。
    2023-05-05归属地:北京
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部