Skip to content

查询缓存

IBest-ORM 提供了查询缓存功能,可以缓存查询结果,减少数据库访问,提高性能。

初始化缓存

ts
import { initQueryCache, getQueryCache } from '@ibestservices/ibest-orm';

// 初始化缓存,设置默认 TTL(毫秒)
initQueryCache({ ttl: 60000 });  // 60秒过期

基本使用

ts
const cache = getQueryCache();

// 设置缓存
cache.set('user_list', users);

// 获取缓存
const cachedUsers = cache.get('user_list');

// 检查缓存是否存在
if (cachedUsers) {
  console.log('从缓存获取');
} else {
  console.log('缓存未命中');
}

缓存查询结果

ts
const orm = getORM();
const cache = getQueryCache();

function getActiveUsers() {
  const cacheKey = 'active_users';

  // 尝试从缓存获取
  let users = cache.get(cacheKey);

  if (!users) {
    // 缓存未命中,查询数据库
    users = orm.query(User).where({ status: 'active' }).find();
    // 存入缓存
    cache.set(cacheKey, users);
  }

  return users;
}

缓存失效

按键失效

ts
// 删除特定缓存
cache.delete('user_list');

按表名失效

ts
// 清除与 user 表相关的所有缓存
cache.invalidate('user');

清除所有缓存

ts
// 清除所有缓存
cache.clear();

自动失效策略

在数据变更时自动清除相关缓存:

ts
// 插入数据后清除缓存
orm.insert(user);
cache.invalidate('user');

// 更新数据后清除缓存
orm.save(user);
cache.invalidate('user');

// 删除数据后清除缓存
orm.deleteById(User, 1);
cache.invalidate('user');

缓存配置

ts
interface CacheConfig {
  ttl: number;  // 缓存过期时间(毫秒)
}

// 初始化时配置
initQueryCache({
  ttl: 300000  // 5分钟
});

完整示例

ts
import { getORM, initQueryCache, getQueryCache } from '@ibestservices/ibest-orm';

// 初始化
const orm = getORM();
initQueryCache({ ttl: 60000 });
const cache = getQueryCache();

// 用户服务
class UserService {
  private cachePrefix = 'user:';

  // 获取用户列表(带缓存)
  getUsers(): User[] {
    const key = `${this.cachePrefix}list`;
    let users = cache.get(key);

    if (!users) {
      users = orm.query(User).find();
      cache.set(key, users);
    }

    return users;
  }

  // 获取单个用户(带缓存)
  getUserById(id: number): User | null {
    const key = `${this.cachePrefix}${id}`;
    let user = cache.get(key);

    if (!user) {
      user = orm.query(User).where({ id }).first();
      if (user) {
        cache.set(key, user);
      }
    }

    return user;
  }

  // 创建用户(清除缓存)
  createUser(user: User): number {
    const id = orm.insert(user);
    cache.invalidate('user');
    return id;
  }

  // 更新用户(清除缓存)
  updateUser(user: User): void {
    orm.save(user);
    cache.delete(`${this.cachePrefix}${user.id}`);
    cache.delete(`${this.cachePrefix}list`);
  }

  // 删除用户(清除缓存)
  deleteUser(id: number): void {
    orm.deleteById(User, id);
    cache.invalidate('user');
  }
}

最佳实践

  1. 合理设置 TTL:根据数据更新频率设置合适的过期时间
  2. 及时清除缓存:数据变更后及时清除相关缓存
  3. 使用有意义的键名:便于管理和调试
  4. 避免缓存大量数据:缓存占用内存,避免缓存过大的数据集
  5. 考虑缓存穿透:对于不存在的数据,也可以缓存空结果