41.0.1 • Published 10 months ago

@mwcp/cache v41.0.1

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

@mwcp/cache

Midway.js 声明式缓存组件

GitHub tag Version License npm.io ci codecov Conventional Commits lerna

Note

ESM build only, requires @midwayjs >= 3.12 and set "type": "module" in packages.json

安装依赖

npm i @mwcp/cache

更新配置

Update project src/configuration.ts

import { Configuration } from '@midwayjs/decorator'
import * as koa from '@midwayjs/koa'
import * as cache from '@mwcp/cache'

@Configuration({
  imports: [
    koa,
    cache,
  ],
  importConfigs: [join(__dirname, 'config')],
})
export class ContainerConfiguration implements ILifeCycle {
}

更改默认设置,通过文件 src/config/config.{default | prod | unittest}.ts

import { CacheManagerConfig } from '@mwcp/cache'

export const cacheManagerConfig: CacheManagerConfig = {
  clients: {
    default: {
      store: 'memory',
      options: {
        max: 512,
        ttl: 10,  // Second!
      },
    }
  }
}

使用

Normal Cache-Docs

判断返回对象值是否来自于缓存

assert(retrieveCacheMetaFrom(data))

缓存入口生成规则

  • none of cacheName and key: {className}.{methodName}
  • cacheName string
    • key string | number | bigint: {className}.{methodName}:{key.toString()}
    • key undefined: {className}.{methodName}
    • key false: no cache operation
    • key KeyGenerator
      • string: {className}.{methodName}:{key.toString()}
      • undefined: {className}.{methodName}
      • false: no cache operation

Cacheable 装饰器

supports class and method

CacheableArgs Parameters

nametypedefault value
cacheNamestring | undefined{className}.{methodName}
keystring | number | bigint | KeyGenerator | undefined | falseundefined
ttlnumber | undefined10(sec)
conditionCacheConditionFn | boolean | undefinedundefined (always cache)
import { Cacheable } from '@mwcp/cache'

@Controller('/')
export class FooController {

  async hello(): Promise<string> {
    return this._hello()
  }

  /* cacheName will be `{class name}.{method name}` => "FooController.hello" */
  @Cacheable()
  async _hello(): Promise<string> {
    return 'world'
  }

  @Cacheable({ ttl: 5 })
  async _hello2(): Promise<string> {
    return 'world'
  }
}
import { Cacheable } from '@mwcp/cache'

@Cacheable() 
export class FooService {

  async hello(): Promise<string> {
    return 'hello'
  }

  @Cacheable({ ttl: 5 })  // override parameters of class decorator
  async hello2(): Promise<string> {
    return 'world'
  }

  @Cacheable({ key: 'bar' }) // cacheKey will be `FooService.hello2:bar`
  async hello2(): Promise<string> {
    return 'world'
  }

  @Cacheable({ key: (input: UserDTO) => input.uid.toString() }) // cacheKey will be `FooService.world:${uid}`
  async world(input: UserDTO): Promise<string> {
    return 'world'
  }

}

CacheEvict 装饰器

supports method

CacheEvictArgs Parameters

nametypedefault value
cacheNamestring | undefined{className}.{methodName}
keystring | number | bigint | KeyGenerator | undefinedundefined
beforeInvocationboolean | undefinedfalse
conditionCacheConditionFn | boolean | undefinedundefined (always evict)
resultany | undefinedalways undefined if beforeInvocation true
import { Cacheable, CacheEvict } from '@mwcp/cache'

const cacheName = 'UserService.getOne' 

@Cacheable() 
export class UserService {

  @Cacheable({ cacheName })
  async getOne(): Promise<UserDTO> {
    return { uid: 1 }
  }

  @CacheEvict({ cacheName }) // same cacheName with getOne()
  async updateOne(): Promise<UserDTO> {
    return { uid: 2 }
  }
}

CachePut 装饰器

supports method

import { CachePut } from '@mwcp/cache'

const cacheName = 'FooRepo.getOne'

@Controller('/')
export class FooRepo {

  @Cacheable({ cacheName, ttl: 5 })
  async getOne(): Promise<string> {
    return 'world'
  }

  @CachePut({ cacheName })
  async update(): Promise<string> {
    return 'hello'
  }

}

装饰器泛型参数

从泛型参数自动获取方法调用参数类型

import { Cacheable } from '@mwcp/cache'

@Cacheable() 
export class FooService {

  @Cacheable<FooService['world']>({  // pass generics and then input will get the type automatically
    key: ([input]) => input.uid.toString()
  }) // cacheKey will be `FooService.world:${uid}`
  async world(input: UserDTO): Promise<string> {
    return 'world'
  }

}
@Cacheable() 
export class FooService {
  @Cacheable<FooService['hello']>({  // <--- pass FooService['hello'] as method type
    key: (args) => args[0].uid.toString()   // <--- args 自动推导为类型 [UserDTO, string | undefined]
  }) 
  async hello(input: UserDTO, input2?: string): Promise<string> {
    return 'world'
  }
}

More examples

License

MIT

Languages

39.3.0

1 year ago

39.2.0

1 year ago

40.0.0

1 year ago

41.0.1

10 months ago

41.0.0

12 months ago

40.1.0

1 year ago

40.1.1

1 year ago

38.4.0

1 year ago

39.1.2

1 year ago

39.1.1

1 year ago

39.1.0

1 year ago

39.0.2

1 year ago

39.0.1

1 year ago

39.0.0

1 year ago

38.3.0

1 year ago

38.2.3

1 year ago

38.2.2

1 year ago

38.0.0

1 year ago

38.1.0

1 year ago

38.2.1

1 year ago

38.2.0

1 year ago

37.4.1

1 year ago

37.4.0

1 year ago

37.2.2

1 year ago

37.2.3

1 year ago

37.2.4

1 year ago

37.3.0

1 year ago

37.2.1

1 year ago

30.16.0

1 year ago

30.16.1

1 year ago

36.0.0

1 year ago

35.2.0

1 year ago

35.2.1

1 year ago

30.3.0

1 year ago

29.2.0

1 year ago

36.1.2

1 year ago

36.1.3

1 year ago

36.1.0

1 year ago

30.15.1

1 year ago

36.1.1

1 year ago

30.15.2

1 year ago

30.15.0

1 year ago

28.2.0

1 year ago

31.0.0

1 year ago

30.2.0

1 year ago

29.3.0

1 year ago

29.3.1

1 year ago

30.18.0

1 year ago

30.10.0

1 year ago

30.10.1

1 year ago

30.10.2

1 year ago

30.9.0

1 year ago

30.9.1

1 year ago

30.1.0

1 year ago

30.1.1

1 year ago

30.21.0

1 year ago

37.0.0

1 year ago

29.0.1

1 year ago

29.0.0

1 year ago

30.17.1

1 year ago

30.17.0

1 year ago

30.8.0

1 year ago

30.0.0

1 year ago

34.0.1

1 year ago

34.0.0

1 year ago

30.20.0

1 year ago

37.1.0

1 year ago

29.1.0

1 year ago

30.12.0

1 year ago

30.12.1

1 year ago

30.7.2

1 year ago

30.7.0

1 year ago

30.7.1

1 year ago

37.2.0

1 year ago

30.19.0

1 year ago

30.11.0

1 year ago

30.11.1

1 year ago

30.11.2

1 year ago

30.6.1

1 year ago

30.6.0

1 year ago

27.0.1

1 year ago

33.0.0

1 year ago

28.1.0

1 year ago

30.14.0

1 year ago

28.1.1

1 year ago

30.5.0

1 year ago

35.0.0

1 year ago

35.0.1

1 year ago

32.0.0

1 year ago

28.0.0

1 year ago

30.13.0

1 year ago

30.4.0

1 year ago

35.1.0

1 year ago

27.0.0

1 year ago

26.5.3

1 year ago

26.5.2

2 years ago

26.5.1

2 years ago

26.3.2

2 years ago

26.5.0

2 years ago

26.4.0

2 years ago

26.3.1

2 years ago

26.3.0

2 years ago

26.2.1

2 years ago

26.2.0

2 years ago

26.1.0

2 years ago

26.0.2

2 years ago

26.0.1

2 years ago

26.0.0

2 years ago

25.2.3

2 years ago

25.1.0

2 years ago

25.2.0

2 years ago

25.2.2

2 years ago

25.2.1

2 years ago

25.0.2

2 years ago

25.0.1

2 years ago

25.0.0

2 years ago

24.2.3

2 years ago

24.2.4

2 years ago

24.2.2

2 years ago

24.2.1

2 years ago

24.2.0

2 years ago

24.1.0

2 years ago

23.1.0

2 years ago

23.2.0

2 years ago

24.0.0

2 years ago

23.0.0

2 years ago

22.1.2

2 years ago

22.1.1

2 years ago

22.1.0

2 years ago

20.11.0

2 years ago

21.0.0

2 years ago

21.1.0

2 years ago

22.0.1

2 years ago

22.0.0

2 years ago

20.12.0

2 years ago

20.10.0

2 years ago

20.10.1

2 years ago

20.9.0

2 years ago

20.6.0

2 years ago

20.3.0

2 years ago

20.7.0

2 years ago

20.8.1

2 years ago

20.8.0

2 years ago

20.5.0

2 years ago

20.0.0

2 years ago

19.0.0

2 years ago

19.0.3

2 years ago

11.2.0

2 years ago

15.0.0

2 years ago

11.1.0

2 years ago

19.2.1

2 years ago

19.2.0

2 years ago

19.1.0

2 years ago

19.1.1

2 years ago

11.3.3

2 years ago

11.3.4

2 years ago

11.3.1

2 years ago

11.3.2

2 years ago

11.3.5

2 years ago

11.3.0

2 years ago

11.0.17

2 years ago

11.0.18

2 years ago

11.0.15

2 years ago

11.0.16

2 years ago

11.0.19

2 years ago

11.0.10

3 years ago

11.0.13

3 years ago

11.0.14

3 years ago

11.0.11

3 years ago

11.0.12

3 years ago

11.0.9

3 years ago

10.0.0

3 years ago

10.0.1

3 years ago

8.0.9

3 years ago

8.0.8

3 years ago

8.0.5

3 years ago

8.0.4

3 years ago

8.0.7

3 years ago

8.0.6

3 years ago

11.0.7

3 years ago

11.0.4

3 years ago

4.6.1

3 years ago

11.0.5

3 years ago

11.0.8

3 years ago

11.0.2

3 years ago

11.0.3

3 years ago

11.0.0

3 years ago

11.0.1

3 years ago

5.0.0

3 years ago

6.0.1

3 years ago

6.0.0

3 years ago

6.0.3

3 years ago

6.0.2

3 years ago

7.0.0

3 years ago

8.0.1

3 years ago

8.0.0

3 years ago

8.0.3

3 years ago

8.0.2

3 years ago

9.0.1

3 years ago

9.0.0

3 years ago

4.5.0

3 years ago

4.2.3

3 years ago

4.4.0

3 years ago

4.3.1

3 years ago

4.6.0

3 years ago

4.3.0

3 years ago

2.3.0

3 years ago

2.2.1

3 years ago

2.2.0

3 years ago

2.1.1

3 years ago

2.5.0

3 years ago

2.4.0

3 years ago

2.7.0

3 years ago

2.5.2

3 years ago

2.6.0

3 years ago

2.5.1

3 years ago

2.9.0

3 years ago

2.5.4

3 years ago

2.8.0

3 years ago

2.5.3

3 years ago

2.1.0

3 years ago

2.0.1

3 years ago

2.9.2

3 years ago

2.5.6

3 years ago

2.9.1

3 years ago

2.5.5

3 years ago

2.5.8

3 years ago

2.9.3

3 years ago

2.5.7

3 years ago

3.0.0

3 years ago

4.2.2

3 years ago

4.1.0

3 years ago

4.0.1

3 years ago

4.0.0

3 years ago

4.2.1

3 years ago

4.0.3

3 years ago

4.2.0

3 years ago

4.0.2

3 years ago

2.0.0

3 years ago

1.0.0

3 years ago