该库提供了 lru 的具体完成,从版本7开端,这是JavaScript中性能最高的LRU完成之一,并支持多种多样的用例。
// 'max'、'ttl'、'maxSize' 三个参数必须填写至少一个
const options = {
max: 500,
}
const cache = new LRUCache(options)
cache.set('key', 'value')
cache.get('key') // "value"
class LRUCache<K, V, FC = unknown>(options)
- K, V 为 键 值 的数据类型
- FC 为 async fetch() 的接受的 context 参数类型
Options 装备
max
(只读)
缓存中保存的最大项目数量。设置最大值能够防止缓存无界增加。
ttl
元素的最大存活时刻,当存活时刻届时或许不会立即被删去,即使从链表中删去,或许不会立即被垃圾收回机制进行内存的收回。
maxSize
(只读)
缓存中保存的一切项目所占空间的最大值
maxEntrySize
每一项元素所占空间的最大值,超越这个巨细的元素无法增加的缓存中。
sizeCalculation
用于核算一切传入的元素的巨细的函数,能够掩盖掉 lru-cache 内部的核算函数。
fetchMethod(key, staleValue, { signal, options, context })
(只读)
进行异步操作,回来 promise
const c = new LRUCache({
ttl: 100,
ignoreFetchAbort: true, // true 时会忽略传递给 fetchMethod 的 AbortSignal 目标宣布的间断事情,除非 signal 未定义,否则仍然会对成果进行缓存。
allowStaleOnFetchAbort: true, // 当传递给 fetchMethod 的 AbortSignal 触发 “abort” 事情时,设置为 true 能够从缓存中回来一个过期的值。
fetchMethod: async (key, oldValue, { signal }) => {
// 不要将 signal 作为参数传递给 fetch 函数
const res = await fetch(`https://slow-backend-server/${key}`)
return await res.json()
},
})
// 会在 100 毫秒后回来过期的值,并进行值的更新。
const val = await c.fetch('key', { signal: AbortSignal.timeout(100) })
dispose(value, key, reason)
(只读)
当元素从缓存中删去时调用的函数。
原因为下列字符串之一:
-
evict
:为增加的元素倒空间 -
set
:元素被掩盖 -
delete
:运用cache.delete(key)
或cache.clear()
删去了该元素
ttlResolution
查看过期的元素的时刻间隔. 默认值为 1,意味着每毫秒会查看一遍列表,确保没有过期的元素。设置为较高的值会提高性能。
ttlAutopurge
是否立即删去过期的元素,这或许会显著下降性能,特别是当缓存存储大量项目时。
updateAgeOnGet
当调用 get 方法时会将元素的存活时刻重置,让元素不会过期。但不确保其他方法不会将元素删去。
API
set(key, value, [{ size, sizeCalculation, ttl, noDisposeOnSet, start, status }])
向缓存增加一个值。
可选选项目标或许包括如上所述的 ttl 和 sizeCalculation,默以为缓存目标上的设置。
get(key, { updateAgeOnGet, allowStale, status } = {}) => value
从缓存中获取值
async fetch(key, options = {}) => Promise
options 包括下列特点
updateAgeOnGet
allowStale
size
sizeCalculation
ttl
noDisposeOnSet
forceRefresh
status
signal
context
peek(key, { allowStale } = {}) => value
类似于 get()
,但不会更新最近或删去过期的元素。
假如元素过期,则回来 undefined,除非在缓存或选项目标中设置 allowStale。
has(key, { updateAgeOnHas, status } = {}) => Boolean
查看缓存中是否存在对应元素
delete(key)
从缓存中删去对应元素
clear()
清空缓存
keys()
回来一个一切 keys 的 generator,从最多运用到最近运用。
rkeys()
回来一个一切 keys 的 generator,从最近运用到最多运用,刚好和keys相反。
values()
回来一个一切 values 的 generator,从最多运用到最近运用。
rvalues()
回来一个一切 values 的 generator,从最近运用到最多运用,刚好和 values 相反。
entries()
回来一个一切 键值对 的 generator, 从最多运用到最近运用。
rentries()
回来一个一切 键值对 的 generator, 从最近运用到最多运用,与 entries 相反。
find(fn, [getOptions])
类似于 Array.find() 回来契合条件的值。
LRU 是什么
LRU是Least Recently Used的缩写,意思是最近最少运用,它是一种Cache替换算法。最近运用最少(LRU)缓存按运用顺序安排项目,能够快速识别哪个项目在最长时刻内没有运用过。
一个应用场景是当B端用户读取页面时,需求从磁盘读取静态文件然后经过http/https进行请求的响应,而每次请求到来时若都去磁盘进行读取,速度是很慢的,假如在读取一次之后将需求响应的文件增加到内存中,下一次读取时相应速率会产生质的提高,因此有了 lru 。这也引申出一个问题,假如缓存较小或需求缓存的文件很大,需求怎样处理?
优点:
- 超快速访问。LRU缓存按最近运用到最后运用的顺序存储项目。时刻复杂度为 O(1)。
- 超快的更新。每次访问项目时,更新缓存都需求 O(1)。
缺点:
- 占用空间较大。LRU缓存 存储 n 项元素时 一起 需求长度为 n 的链表以及容量为 n 的 hashmap,空间复杂度O(n)