前言
算法就是从input
到output
过程的一个实现,因此我们在学习或琢磨算法问题时应该先捋清思路,明确我们需要得到的是什么,试着列举从输入到输出我们需要处理的任务项,逐个实现。
什么是 LRU 缓存
首先我们看看百度百科对 LRU 的描述
LRU 是 Least Recently Used 的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。
针对百度百科的描述,举个例子:我们在使用浏览器浏览窗口时候,我们一个接一个的访问新的页面,内存将我们这些页面进行了缓存以方便我们稍后回过头访问;但是随着时间的推移,不断新增的新页即将塞满浏览器有限的内存,这个时候为了保证浏览器仍能正常工作,我们不得不删除页面来减少内存的占用;删除哪些页面呢?可以按访问的先后顺序或者说一个标准,LRU
缓存就是这么一个标准,把最近时间内,最久未访问的页面给干掉。
使用场景
- 系统底层的内存管理
- 页面的置换算法
- 一般的缓存服务,memcache、redis 之类
- 部分资源有限的业务场景
简易实现
经过分析我们不难得出 LRU
有如下特点:
- 资源有限,假使资源无限我们也就不需要利用
LRU
进行删除处理· - 存储空间需要是有序的,因为有序的数据结构才能让我们按顺序删除数据的以节省条件查询的时间,
javascript
中可采用Arrary
、Map
数据结构 - 存储空间达到上限时再新增数据,自动删除记录中最久远的数据
- 能从我们的存储的数据结构中获取和设置指定数据(get & set)
下面就用代码来实现这么一个满足特性的LRUCache
类
1 |
|
我们主要是实现了set
和get
数据存取的两个方法,而数据的删除是由数据存储空间大小限制在set
过程中自动处理的,接下来我们测试一下我们LRUCache
的两个方法
set
可以清楚看到,在存储空间占满之前,set
按照先后顺序依次进行存储,当存储空间满了之后,会删除最旧的数据
- get
get
会在获取指定数据的同时,更新该数据在存储空间的所在顺序至最前
总结
就这样一个javascript
版本的简易LRU缓存
算法就被我们实现了,是不是觉得 just so so 😁
当然LRU缓存
的核心思路远不只是这么简易,有兴趣的同学可以再深入进行探究~