FnMergeCache
是一个缓存工具,允许函数根据输入参数缓存其结果,支持缓存过期时间、大小限制、错误处理和参数比较,同时支持通过标签和全局重新验证进行缓存失效。
npm install fn-merge-cache
- 缓存函数:支持缓存函数的返回结果,以提高性能和减少重复计算。
- 缓存过期:支持设置缓存的过期时间(TTL),并在时间到期后自动清除缓存。
- 缓存大小限制:支持设置最大缓存大小,以限制缓存池的大小。
- 错误处理:可以选择在函数调用失败时是否缓存错误结果。
- 参数比较:允许自定义参数比较函数,以确定是否可以使用缓存结果。
- 缓存失效:通过标签机制进行缓存失效和重新验证,可以按标签或全局重新验证缓存。
- 合并承诺:支持处理返回的 Promise,并在 Promise 解决后更新缓存状态。
- 事件驱动:使用 EventEmitter 进行缓存失效通知,允许对缓存的有效性进行精细控制。
- 智能缓存策略:未设置缓存ttl时,将切换使用 LRU 算法。
一个用于缓存函数调用结果的工具,支持缓存过期、大小限制、错误处理、标签机制等功能。
new FnMergeCache<A extends any[], R>(
fn: (...args: A) => R,
opt?: {
cache?: boolean;
cacheOnError?: boolean;
argComparer?: (a: A, b: A) => boolean;
ttl?: number;
maxCacheSize?: number;
tags?: string[];
}
)
- fn: 要缓存的函数。
- cache: 是否启用缓存。默认值为 true。
- cacheOnError: 是否在函数抛出错误时缓存结果。默认值为 false。
- argComparer: 用于比较函数参数的自定义函数。默认使用 lodash 的 isEqual。
- ttl: 缓存的生存时间(毫秒),0 表示永不过期。默认值为 0。
- maxCacheSize: 缓存的最大数量,0 表示没有限制。默认值为 0。
- tags: 缓存失效的标签。
-
call(...args: A): R
使用提供的参数调用缓存的函数,并返回结果。如果存在有效的缓存结果,则返回缓存结果;否则,执行函数并缓存结果。
-
revalidate()
清除所有缓存数据。此方法清除与实例相关的所有缓存数据。
-
dispose()
释放缓存实例资源,停止缓存,并移除所有事件监听器。
创建一个带有缓存功能的函数。
function createMergedCachedFn<A extends any[], R>(
fn: (...args: A) => R,
opt?: {
cache?: boolean;
cacheOnError?: boolean;
argComparer?: (a: A, b: A) => boolean;
ttl?: number;
maxCacheSize?: number;
tags?: string[];
}
): (...args: A) => R
- fn: 要缓存的函数。
- opt: 缓存选项,与 FnMergeCache 构造函数的选项相同。
一个带有缓存功能的函数,行为与 FnMergeCache 相同。
通过标签或全局重新验证缓存。
function revalidateTag(tags?: string | string[]): void
import { FnMergeCache, revalidateTag } from 'fn-merge-cache';
// 定义一个需要缓存的函数
function fetchData(id) {
console.log(`Fetching data for ${id}`);
return new Promise((resolve) => {
setTimeout(() => resolve(`Data for ${id}`), 1000);
});
}
// 创建一个缓存实例
const cache = new FnMergeCache(fetchData, {
cache: true, // 启用缓存
cacheOnError: true, // 缓存错误结果
ttl: 5000, // 缓存过期时间
maxCacheSize: 10, // 最大缓存大小
tags: ['data-fetch'], // 缓存标签
});
// 使用相同参数调用函数
cache.call(1).then((data) => {
console.log(data); // 输出: Fetching data for 1 \n Data for 1
});
cache.call(1).then((data) => {
console.log(data); // 输出: Data for 1 (来自缓存)
});
// 使用不同参数调用函数
cache.call(2).then((data) => {
console.log(data); // 输出: Fetching data for 2 \n Data for 2
});
// 重新验证缓存
cache.revalidate();
// 或通过标签重新验证缓存
revalidateTag('data-fetch');
// 或重新验证所有缓存
revalidateTag();
// 使用相同参数调用函数
cache.call(1).then((data) => {
console.log(data); // 输出: Fetching data for 1 \n Data for 1 (重新获取)
});
// 释放缓存实例
cache.dispose();
import { createMergedCachedFn, revalidateTag } from 'fn-merge-cache';
const mergedCachedFn = createMergedCachedFn(fetchData, {
cache: true,
cacheOnError: true,
ttl: 5000,
maxCacheSize: 10,
tags: ['data-fetch'],
});
// 使用相同参数调用函数
mergedCachedFn(1).then((data) => {
console.log(data); // 输出: Fetching data for 1 \n Data for 1
});
// 重新验证缓存
revalidateTag('data-fetch');
import { createMergedCachedFn } from 'fn-merge-cache';
const justMergeFn = createMergedCachedFn(fetchData, {
cache: false,
});
justMergeFn(1).then((data) => {
console.log(data); // 输出: Fetching data for 1 \n Data for 1
});
justMergeFn(1).then((data) => {
console.log(data); // 输出: Data for 1 (合并调用)
justMergeFn(1).then((data) => {
console.log(data); // 输出: Fetching data for 1 \n Data for 1 (重新获取)
});
});
MIT