1.0.5 • Published 10 months ago

@iocore/cache-dispenser-momery v1.0.5

Weekly downloads
-
License
-
Repository
-
Last release
10 months ago

@iocore/cache-dispenser-momery

npm version

注意: 包名可能是 memory 的拼写错误。

IoCore 的内存缓存分发器。

这是 @iocore/cache 模块 CacheDispenser 抽象类的一个具体实现,将缓存数据存储在 Node.js 进程的内存中。支持设置缓存过期时间。

安装

npm install @iocore/cache-dispenser-momery @iocore/cache @iocore/component --save
# or
yarn add @iocore/cache-dispenser-momery @iocore/cache @iocore/component

依赖

  • @iocore/cache: 提供 CacheDispenser 抽象类。
  • @iocore/component: IoCore 核心组件系统。

配置

该模块没有外部配置项。

使用

MomeryCacheDispenser 类是一个 IoCore Application 组件(因为它有 initializeterminate 来管理过期检查定时器),通常作为其他需要缓存的组件(如 @iocore/configs)的依赖项注入。

import { Application } from '@iocore/component';
import { CacheDispenser } from '@iocore/cache';
import MomeryCacheDispenser from '@iocore/cache-dispenser-momery';

// 模拟一个需要缓存的服务
@Application.Injectable()
class MyCachedService extends Component {
  // 注入内存缓存分发器
  @Application.Inject(MomeryCacheDispenser)
  private cache: CacheDispenser<string>; // 类型参数 R 定义了缓存值的类型

  private async expensiveOperation(userId: number): Promise<string> {
    console.log(`Performing expensive operation for user ${userId}...`);
    await new Promise(res => setTimeout(res, 100)); // 模拟耗时
    return `Data for user ${userId}`;
  }

  async getUserData(userId: number): Promise<string> {
    const cacheKey = `user:${userId}:data`;

    if (await this.cache.has(cacheKey)) {
      console.log(`Cache hit for key: ${cacheKey}`);
      const ttl = await this.cache.ttl(cacheKey);
      console.log(`TTL: ${ttl} seconds`);
      return this.cache.get(cacheKey);
    }

    console.log(`Cache miss for key: ${cacheKey}`);
    const data = await this.expensiveOperation(userId);
    // 缓存数据 60 秒
    await this.cache.set(cacheKey, data, 60);
    return data;
  }

  async clearUserData(userId: number): Promise<void> {
    const cacheKey = `user:${userId}:data`;
    await this.cache.delete(cacheKey);
    console.log(`Cache cleared for key: ${cacheKey}`);
  }
}

// 启动应用
// 确保 MomeryCacheDispenser 被 IoCore 管理
@Application.Inject(MomeryCacheDispenser, MyCachedService)
class BootApp extends Application {
  @Application.Inject(MyCachedService)
  service: MyCachedService;

  async main() {
    console.log('--- First call ---');
    await this.service.getUserData(123);
    console.log('\n--- Second call (should hit cache) ---');
    await this.service.getUserData(123);

    console.log('\n--- Clearing cache ---');
    await this.service.clearUserData(123);

    console.log('\n--- Third call (should miss cache) ---');
    await this.service.getUserData(123);
  }

  // Application 抽象类要求实现 initialize 和 terminate
  initialize() {}
  terminate() {}
}

Application.start(BootApp);

MomeryCacheDispenser<R = any>

继承自 CacheDispenser

  • initialize(): void: 启动一个 setInterval 定时器 (每秒检查一次),用于清理过期的缓存条目。IoCore 会自动调用。
  • terminate(): void: 清除过期检查定时器。IoCore 会自动调用。
  • set(key: string, value: R, time?: number): Promise<R>: 设置缓存。
    • key: 缓存键。
    • value: 要缓存的值。
    • time (可选): 过期时间(秒)。如果为 0 或不提供,则永不过期。
    • 返回 value
  • has(key: string): Promise<boolean>: 检查缓存键是否存在(且未过期)。
  • get(key: string): Promise<R>: 获取缓存值。如果键不存在或已过期,行为未定义(可能返回 undefined)。应先用 has 检查。
  • ttl(key: string): Promise<number>: 获取缓存键的剩余生存时间(秒)。如果键不存在或永不过期,返回 undefined0 (根据实现,当前实现对于永不过期返回 0,不存在可能出错)。
  • delete(key: string): Promise<void>: 删除缓存键。

贡献

欢迎提交 Pull Request。对于重大更改,请先开一个 Issue 来讨论您想要更改的内容。

许可证

MIT

1.0.7

10 months ago

1.0.6

10 months ago

1.0.5

10 months ago

1.0.4

10 months ago

1.0.3

10 months ago

1.0.2

10 months ago

1.0.1

10 months ago

1.0.0

10 months ago