Skip to content

Redis缓存

Redis缓存基于Redis实现

创建Redis缓存

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

1. Cli命令

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

2. 菜单命令

TIP

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

Redis缓存定义

typescript
export type TCacheRedisStudentKey = string;
export interface TCacheRedisStudentData { id: string; name: string }

@CacheRedis({
  ttl: 2 * 3600 * 1000,
})
export class CacheRedisStudent
  extends BeanCacheRedisBase<TCacheRedisStudentKey, TCacheRedisStudentData> {}
  • TCacheRedisStudentKey: 定义缓存 Key 的类型
  • TCacheRedisStudentData: 定义缓存 Data 的类型

Redis缓存参数

可以为 Redis 缓存配置参数

typescript
@CacheRedis({
  ttl: 2 * 3600 * 1000,
  updateAgeOnGet: true,
  disableInstance: false,
  disableTransactionCompensate: false,
  client: 'cache',
})
class CacheRedisStudent {}
名称类型默认值说明
ttlnumber缓存的过期时间
updateAgeOnGetbooleantrue当读取缓存时是否更新ttl
disableInstancebooleanfalse是否禁用实例隔离。在默认情况下,多实例之间的缓存是隔离的
disableTransactionCompensatebooleanfalse是否禁止事务补偿。启用事务补偿可以确保缓存数据一致性
clientstring'cache'缓存所使用的Redis Client

App Config

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

src/backend/config/config/config.ts

typescript
// onions
config.onions = {
  cacheRedis: {
    'demo-student:student': {
      ttl: 2 * 3600 * 1000,
      updateAgeOnGet: true,
      disableInstance: false,
      disableTransactionCompensate: false,
      client: 'cache',
    },
  },
};

Redis缓存启用/禁用

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

1. Enable

src/backend/config/config/config.ts

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

2. Meta

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

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

使用Redis缓存

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

缓存方法参数

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

typescript
await this.scope.cacheRedis.student.set(student, '1', {
  ttl: 2 * 3600 * 1000,
  disableTransactionCompensate: true,
  db: this.ctx.db,
});
名称类型说明
ttlnumber缓存的过期时间
disableTransactionCompensateboolean是否禁止事务补偿
dbServiceDb在进行事务补偿时,会用到此db对象。在默认情况下,自动使用上下文中的db对象
  • db: VonaJS 支持多数据库/多数据源,因此可以通过db精确控制事务补偿能力

缓存方法清单

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

基于 MIT 许可发布