Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | 1x 9x 9x 20x 8x 4x 4x 1x 3x 3x 3x 3x 14x 1x 14x 14x 1x 1x | /** * @description lru缓存算法。指定缓存空间长度,当缓存超出时,清除最不活跃的缓存。 * @author liukun <919590347@qq.com> * @example * import { LRUCache } from '@wont/utils' * * const lru = new LRUCache(3); * lru.set(1, 1); * lru.set(2, 2); * lru.set(3, 3); * lru.set(4, 4); * lru.set(4, 5); * console.info(lru.get()); // return Map(3) { 2 => 2, 3 => 3, 4 => 5 } */ export class LRUCache { #map: Map<unknown, unknown> #length: number /** * 创建LRUCache实例 * @param {number} [len=0] - lru缓存上限,默认为0,无上限。 */ constructor(len = 0) { this.#map = new Map() this.#length = len } /** * 检测是否有缓存 * @param {unknown} key - The key to check. * @returns {boolean} 是否存在缓存 */ has(key: unknown): boolean { return this.#map.has(key) } /** * 通过key获取缓存。如果存在缓存,则更新为最近使用。 * @param {unknown} key - The key to retrieve the value for. * @returns {unknown | null | Map<unknown, unknown>} 不存在返回null。key不传返回全部缓存map */ get(key?: unknown): unknown | null | Map<unknown, unknown> { if (!key) { return this.#map } if (!this.has(key)) { return null } const val = this.#map.get(key) this.#map.delete(key) this.#map.set(key, val) return this.#map.get(key) } /** * 设置新增或修改缓存。并且将设置的缓存设置为最近使用 * @param {unknown} key - The key to set. * @param {unknown} val - The value to set. * @returns {undefined} */ set(key: unknown, val: unknown): void { if (this.has(key)) { this.#map.delete(key) } this.#map.set(key, val) if (this.#length > 0 && this.#map.size > this.#length) { const firstEle = this.#map.keys().next().value this.#map.delete(firstEle) } } } |