declare interface CacheModule {
  /**
   * 获取缓存key
   * @param pattern 匹配项
   */
  keys(pattern?: string): Promise<string[]>;

  /**
   * 获取缓存
   * @param cacheName 缓存名称
   * @param dataLoader 缓存加载方法，当缓存值不存在时，会加载数据并设置到缓存中
   * @param ttl 过期时间
   */
  get<T>(
    cacheName: string,
    dataLoader?: () => Promise<T>,
    ttl?: number
  ): Promise<T>;

  /**
   * 设置缓存
   * @param cacheName 缓存名称
   * @param value 缓存值
   * @param ttl 过期时间单位秒
   */
  set<T>(cacheName: string, value: any, ttl?: number): Promise<T>;

  /**
   * 删除缓存
   * @param cacheName 缓存名称
   * @param matchStart 是否匹配开头为缓存名称的所有key
   */
  del(cacheName: string, matchStart?: boolean): Promise<void>;

  /**
   * 清空缓存 redis会执行flushdb 慎用
   */
  reset(): Promise<void>;
}

/**
 * 缓存上下文
 */
declare const cache: CacheModule;
