LRU 缓存 - hunandali/DaLi.Core-Libs GitHub Wiki
LRU (Least Recently Used) 缓存模块实现了一个基于最近最少使用原理的缓存机制。当缓存达到容量上限时,会优先移除最久未使用的数据。
内部类,用于存储缓存项的数据结构。
class lruValue {
key: string; // 缓存键
value: any; // 缓存值
exp: number; // 超时时长(秒)
prev: lruValue; // 上一个元素
next: lruValue; // 下一个元素
}
主类,提供 LRU 缓存的核心功能。
class LRU {
constructor(capacity: number = 100);
}
参数:
-
capacity
- 缓存容量,默认为 100
获取缓存值。如果键不存在或已过期,返回 undefined。获取操作会将该项移至缓存队列头部。
get(key: string): any;
参数:
-
key
- 缓存键
设置缓存值。如果键已存在,会更新值和过期时间;如果不存在,则新增缓存项。当缓存达到容量上限时,会移除最久未使用的项。
set(key: string, value: any, exp: number): void;
参数:
-
key
- 缓存键 -
value
- 缓存值 -
exp
- 过期时间(秒),0 表示永不过期
移除指定的缓存项。
remove(key: string): void;
参数:
-
key
- 要移除的缓存键
检查是否存在指定的缓存键。
has(key: string): boolean;
参数:
-
key
- 要检查的缓存键
清除所有缓存。
clear(): void;
获取所有缓存键。
keys(): IterableIterator<string>;
获取当前缓存项数量。
length(): number;
清除所有已过期的缓存项。
trim(): void;
// 创建一个容量为 100 的 LRU 缓存
const cache = new LRU(100);
// 设置缓存,10秒后过期
cache.set('key1', 'value1', 10);
// 获取缓存值
const value = cache.get('key1');
// 检查键是否存在
if (cache.has('key1')) {
// 存在该缓存项
}
// 移除缓存项
cache.remove('key1');
// 获取当前缓存数量
const count = cache.length();
// 清理过期缓存
cache.trim();
// 清除所有缓存
cache.clear();
- 使用双向链表存储缓存项,便于快速调整项目位置
- 使用 Map 存储键值对,保证 O(1) 的查找性能
- 最近使用的项会移到链表头部
- 缓存满时,移除链表尾部的项(最久未使用)
- 支持数据过期机制,可以设置每个缓存项的过期时间
- 获取数据时自动检查是否过期
- 提供手动清理过期数据的方法