Skip to content

Mem缓存

Mem缓存基于lru-cache实现

创建Mem缓存

比如,在模块 demo-student 中创建一个 Mem 缓存: student,用于缓存学生数据

1. Cli命令

bash
$ vona :create:bean cacheMem student --module=demo-student

2. 菜单命令

TIP

右键菜单 - [模块路径]: Vona Bean/Cache Mem

Mem缓存定义

typescript
export type TCacheMemStudentKey = string;
export interface TCacheMemStudentData { id: string; name: string }

@CacheMem({
  max: 500,
  ttl: 2 * 3600 * 1000,
})
export class CacheMemStudent
  extends BeanCacheMemBase<TCacheMemStudentKey, TCacheMemStudentData> {}
  • TCacheMemStudentKey: 定义缓存 Key 的类型
  • TCacheMemStudentData: 定义缓存 Data 的类型

Mem缓存参数

可以为 Mem 缓存配置参数

typescript
@CacheMem({
  max: 500,
  ttl: 2 * 3600 * 1000,
  updateAgeOnGet: true,
  updateAgeOnHas: false,
  broadcastOnSet: false,
  disableInstance: false,
  disableTransactionCompensate: false,
})
class CacheMemStudent {}
名称类型默认值说明
maxnumber允许缓存的最大条数
ttlnumber缓存的过期时间
updateAgeOnGetbooleantrue当读取缓存时是否更新ttl
updateAgeOnHasbooleanfalse当判断缓存是否存在时是否更新ttl
broadcastOnSetboolean | 'del'false当设置缓存时,是否需要通过广播设置其他Workers的缓存。设置为del,那么就通过广播删除其他Workers的缓存
disableInstancebooleanfalse是否禁用实例隔离。在默认情况下,多实例之间的缓存是隔离的
disableTransactionCompensatebooleanfalse是否禁止事务补偿。启用事务补偿可以确保缓存数据一致性

App Config

可以在 App Config 中配置 Mem 缓存参数

src/backend/config/config/config.ts

typescript
// onions
config.onions = {
  cacheMem: {
    'demo-student:student': {
      max: 500,
      ttl: 2 * 3600 * 1000,
      updateAgeOnGet: true,
      updateAgeOnHas: false,
      broadcastOnSet: false,
      disableInstance: false,
      disableTransactionCompensate: false,
    },
  },
};

Mem缓存启用/禁用

可以控制 Mem 缓存的启用/禁用

1. Enable

src/backend/config/config/config.ts

diff
// onions
config.onions = {
  cacheMem: {
    'demo-student:student': {
+     enable: true,
    },
  },
};

2. Meta

可以让 Redis 缓存在指定的运行环境生效

名称类型说明
flavorstring|string[]参见: 运行环境与Flavor
modestring|string[]参见: 运行环境与Flavor
  • 举例
diff
@CacheMem({
+ meta: {
+   flavor: 'normal',
+   mode: 'dev',
+ },
})
class CacheMemStudent {}

使用Mem缓存

typescript
class ControllerStudent {
  @Web.get('test')
  async test() {
    const student = { id: '1', name: 'tom' };
    this.scope.cacheMem.student.set(student, '1');
    const value = this.scope.cacheMem.student.get('1');
    assert.deepEqual(student, value);
  }
}
  • this.scope.cacheMem.student: 通过模块 scope 取得缓存实例

缓存方法参数

set方法为例介绍缓存方法的参数

typescript
this.scope.cacheMem.student.set(student, '1', {
  ttl: 2 * 3600 * 1000,
  broadcastOnSet: 'del',
  disableTransactionCompensate: true,
  db: this.ctx.db,
});
名称类型说明
ttlnumber缓存的过期时间
broadcastOnSetboolean | 'del'当设置缓存时,是否需要通过广播设置其他Workers的缓存。设置为del,那么就通过广播删除其他Workers的缓存
disableTransactionCompensateboolean是否禁止事务补偿
dbServiceDb在进行事务补偿时,会用到此db对象。在默认情况下,自动使用上下文中的db对象
  • db: VonaJS 支持多数据库/多数据源,因此可以通过db精确控制事务补偿能力

缓存方法清单

名称说明
get读取缓存
mget同时读取多个缓存
peek拣取缓存,不更新缓存的ttl
set设置缓存
mset同时设置多个缓存
getset设置新缓存,并返回旧值
has判断缓存是否存在
del删除缓存
mdel同时删除多个缓存
clear清理所有缓存

基于 MIT 许可发布