查询缓存
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');
}
}最佳实践
- 合理设置 TTL:根据数据更新频率设置合适的过期时间
- 及时清除缓存:数据变更后及时清除相关缓存
- 使用有意义的键名:便于管理和调试
- 避免缓存大量数据:缓存占用内存,避免缓存过大的数据集
- 考虑缓存穿透:对于不存在的数据,也可以缓存空结果