该库提供了 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-cache 库不完全指南

LRU是Least Recently Used的缩写,意思是最近最少运用,它是一种Cache替换算法。最近运用最少(LRU)缓存按运用顺序安排项目,能够快速识别哪个项目在最长时刻内没有运用过。

一个应用场景是当B端用户读取页面时,需求从磁盘读取静态文件然后经过http/https进行请求的响应,而每次请求到来时若都去磁盘进行读取,速度是很慢的,假如在读取一次之后将需求响应的文件增加到内存中,下一次读取时相应速率会产生质的提高,因此有了 lru 。这也引申出一个问题,假如缓存较小或需求缓存的文件很大,需求怎样处理?

优点:

  • 超快速访问。LRU缓存按最近运用到最后运用的顺序存储项目。时刻复杂度为 O(1)。
  • 超快的更新。每次访问项目时,更新缓存都需求 O(1)。

缺点:

  • 占用空间较大。LRU缓存 存储 n 项元素时 一起 需求长度为 n 的链表以及容量为 n 的 hashmap,空间复杂度O(n)