*/ public function labels(int $companyId): array { return $this->remember($companyId, 'label'); } /** @return list */ public function shops(int $companyId): array { return $this->remember($companyId, 'shop_name'); } public function warm(int $companyId): void { $this->labels($companyId); $this->shops($companyId); $this->total($companyId); } public function forget(int $companyId): void { Cache::forget($this->key($companyId, 'label')); Cache::forget($this->key($companyId, 'shop_name')); Cache::forget($this->totalKey($companyId)); } /** 无筛选时的总行数:233 万行上 COUNT(*) 要 2 秒,缓存后翻页不再重复统计。 */ public function total(int $companyId): int { $key = $this->totalKey($companyId); $cached = Cache::get($key); if (is_numeric($cached)) { return (int) $cached; } $count = (int) JstOrderLabel::query()->where('company_id', $companyId)->count(); Cache::put($key, $count, now()->addMinutes(self::TOTAL_TTL_MINUTES)); return $count; } /** @return list */ private function remember(int $companyId, string $column): array { $key = $this->key($companyId, $column); $cached = Cache::get($key); if (is_array($cached)) { return $cached; } $values = JstOrderLabel::query() ->where('company_id', $companyId) ->whereNotNull($column) ->where($column, '<>', '') ->distinct() ->orderBy($column) ->limit(self::LIMIT) ->pluck($column) ->all(); Cache::put($key, $values, now()->addHours(self::TTL_HOURS)); return $values; } private function key(int $companyId, string $column): string { return "jst-order-labels:options:v1:{$companyId}:{$column}"; } private function totalKey(int $companyId): string { return "jst-order-labels:total:v1:{$companyId}"; } }