缓存管理器
灵活节点JS缓存模块
一个用于节点的缓存模块,可以轻松地将函数包入缓存,分级缓存,以及一个一致的接口.
目录
特征
- 使用打字符并兼容 无害环境管理
- 以缓存方式将任何函数包裹起来的简单方法 .
- 分层缓存 — 数据存储在每个缓存中并从最高处获取 . 优先缓存.
- 使用您想要的任何缓存, 只要它有相同的 API .
- 100%的测试覆盖率 测试。 。 。 .
安装
pnpm install cache-manager
用法实例
单行存储
import { caching } from 'cache-manager';
const memoryCache = await caching('memory', {
max: 100,
ttl: 10 * 1000 /*milliseconds*/,
});
const ttl = 5 * 1000; /*milliseconds*/
await memoryCache.set('foo', 'bar', ttl);
console.log(await memoryCache.get('foo'));
// >> "bar"
await memoryCache.del('foo');
console.log(await memoryCache.get('foo'));
// >> undefined
const getUser = (id: string) => new Promise.resolve({ id: id, name: 'Bob' });
const userId = 123;
const key = 'user_' + userId;
console.log(await memoryCache.wrap(key, () => getUser(userId), ttl));
// >> { id: 123, name: 'Bob' }
见单元测试 test/caching.test.ts 更多信息.
用 mset( ) 和 mget( ) 设置/ 获得数个密钥的例子
await memoryCache.store.mset(
[
['foo', 'bar'],
['foo2', 'bar2'],
],
ttl,
);
console.log(await memoryCache.store.mget('foo', 'foo2'));
// >> ['bar', 'bar2']
// Delete keys with mdel() passing arguments...
await memoryCache.store.mdel('foo', 'foo2');
示例快捷应用使用
自定义存储
可以通过创建与内置内存商店相同的API来使用自定义商店.
同步创建单个缓存存储
作为 caching() 需要async功能来解决一些存储,这不适合用于默认函数/构造参数等.
如果您需要同步创建缓存店, 您可以使用 createCache()数字 :
import { createCache, memoryStore } from 'node-cache-manager';
// Create memory cache synchronously
const memoryCache = createCache(memoryStore(), {
max: 100,
ttl: 10 * 1000 /*milliseconds*/,
});
// Default parameter in function
function myService(cache = createCache(memoryStore())) {}
// Default parameter in class constructor
const DEFAULT_CACHE = createCache(memoryStore(), { ttl: 60 * 1000 });
// ...
class MyService {
constructor(private cache = DEFAULT_CACHE) {}
}
多层
import { multiCaching } from 'cache-manager';
const multiCache = multiCaching([memoryCache, someOtherCache]);
const userId2 = 456;
const key2 = 'user_' + userId;
const ttl = 5;
// Sets in all caches.
await multiCache.set('foo2', 'bar2', ttl);
// Fetches from highest priority cache that has the key.
console.log(await multiCache.get('foo2'));
// >> "bar2"
// Delete from all caches
await multiCache.del('foo2');
// Sets multiple keys in all caches.
// You can pass as many key, value tuples as you want
await multiCache.mset(
[
['foo', 'bar'],
['foo2', 'bar2'],
],
ttl
);
// mget() fetches from highest priority cache.
// If the first cache does not return all the keys,
// the next cache is fetched with the keys that were not found.
// This is done recursively until either:
// - all have been found
// - all caches has been fetched
console.log(await multiCache.mget('key', 'key2'));
// >> ['bar', 'bar2']
// Delete keys with mdel() passing arguments...
await multiCache.mdel('foo', 'foo2');
见单元测试 test/multi-caching.test.ts 更多信息.
快取管理器选项
这个 caching 财务报告和审定财务报表 multiCaching 函数接受一个选项对象作为第二个参数。 有以下备选方案:
- 最大: 可存储在缓存中的项目的最大数量 。 如果缓存已满, 使用最少的项目会被删除 .
- ttl:活在毫秒的时间. 这是物品在被移除前可以在缓存中的最大时间.
- shouldClone BeforeSet:如果是真实的,则在缓存中设置之前将克隆该值。 这是设定为
true默认.
import { caching } from 'cache-manager';
const memoryCache = await caching('memory', {
max: 100,
ttl: 10 * 1000 /*milliseconds*/,
shouldCloneBeforeSet: false, // this is set true by default (optional)
});
在背景中刷新缓存密钥
两者 caching 财务报告和审定财务报表 multicaching 模块支持在背景中刷新过期缓存密钥的机制 wrap 函数.
方法是增加一个 refreshThreshold 属性,同时创建缓存存储或将其传递到 wrap 函数.
若为 refreshThreshold 设置,在从缓存中获取一个值后,将检查 TTL .
如果剩余的TTL小于 refreshThreshold系统将同步更新值,
遵循与标准取取取相同的规则. 在此期间,该系统会还原旧值直到到期.
注:
- 在多切切时,将检查刷新的商店是先找到钥匙的商店(最优先).
- 如果阈值低而工人的功能缓慢,则键会过期而遇到更新值的赛跑条件.
- 背景刷新机制目前不支持向
wrap函数. - 若无
ttl为密钥设置,刷新机制将不会被触发。 对Redis来说ttl默认设置为 -1.
例如,将刷新门槛传递到 caching 像这样:
const memoryCache = await caching('memory', {
max: 100,
ttl: 10 * 1000 /*milliseconds*/,
refreshThreshold: 3 * 1000 /*milliseconds*/,
/* optional, but if not set, background refresh error will be an unhandled
* promise rejection, which might crash your node process */
onBackgroundRefreshError: (error) => { /* log or otherwise handle error */ }
});
当从 Redis 从 TTL 小于 3sec 的值取出时, 值会在背景中更新 .
处理错误
缓存管理器现在不会默认丢出错误 。 相反,所有错误都会通过 error 活动。 以下是如何使用它的例子:
const memoryCache = await caching('memory', {
max: 100,
ttl: 10 * 1000 /*milliseconds*/,
});
memoryCache.on('error', (error) => {
console.error('Cache error:', error);
});
存储引擎
正式更新为上一个版本
-
节点- cache- 管理器- redis- yet (用户数) 节点( redis)(中文(简体) )
-
节点-cache-manager-ioredis - yet( 节点- cache- manager- ioredis - 有) (用户数) 雄风(中文(简体) )
第三方
-
节点- cache- 管理器- redis- store (用户数) 节点( redis)(中文(简体) )
-
节点-cache-manager-ioredis (用户数) 雄风(中文(简体) )
-
节点-cache-manager-hazelcast (节点-cache-manager-hazelcast) 节点-经理-hazelcast 节点-经理-hazelcast
-
@resolid/cache-manager-sqlite (英语) (用户数) 较好的sqlite3(中文(简体) )
贡献
如果你愿意为该项目捐款,请在这里阅读如何捐款 捐款额。 。 。 .
许可证
缓存管理器根据 麻省理工学院许可证。 。 。 .